Gotcha! Now I can understand the escape character means: "Ignore the
following variable reference."
Thank you so much for the explanation with a good solution.

Cheers,

Woonsan

On Thu, Jul 23, 2015 at 2:42 PM, Anthony Brice
<anthonybr...@lateachiever.com> wrote:
> Sorry, the second sentence in the first paragraph should read: "When you
> change the default escape character, you don't need to use it _to_ get a
> dollar sign before a variable reference in your interpolated string."
>
> To explain a little more, consider what happens to " $${amount}" when
> you're using StrSubstitutor's default escape character. StrSubstitutor sees
> that you've got a variable reference ("${amount}"), and that you've got the
> escape character ("$") before it, so it replaces "$${amount}" with
> "${amount}".
>
> Now consider what happens to " $${amount}" when you've set StrSubstitutor's
> escape character to something other than the default. StrSubstitutor sees
> the variable reference ("${amount}"), notes that the character ("$") before
> the variable reference is _not_ the user-defined escape character, and so
> replaces "${amount}" with the appropriate value form the map.
>
> Regards,
> Anthony Brice
>
> On Thu, Jul 23, 2015 at 11:24 AM, Anthony Brice <
> anthonybr...@lateachiever.com> wrote:
>
>> The escape character just tells StrSubstitutor "Ignore the following
>> variable reference." When you change the default escape character, you
>> don't need to use it get a dollar sign before a variable reference in your
>> interpolated string. Try the following:
>>
>> @Test
>>     public void testReplaceEscapingDollarSign() {
>>         values.put("amount", "20.00");
>>
>>         final StrSubstitutor sub = new StrSubstitutor(values);
>>         sub.setEscapeChar('<');
>>
>>         String replaceTemplate = "The <${animal} jumps over the
>> ${target}.";
>>         String expectedResult = "The ${animal} jumps over the lazy dog.";
>>         String replacedResult = sub.replace(replaceTemplate);
>>         assertEquals(expectedResult, replacedResult);
>>
>>         replaceTemplate = "The ${animal} paid $${amount} to jump over
>> the ${target}.";
>>         expectedResult = "The quick brown fox paid $20.00 to jump over
>> the lazy dog.";
>>         replacedResult = sub.replace(replaceTemplate);
>>         assertEquals(expectedResult, replacedResult);
>>     }
>>
>> Regards,
>> Anthony Brice
>>
>>
>> On Thu, Jul 23, 2015 at 7:42 AM, Woonsan Ko <woon...@apache.org> wrote:
>>
>>> Sorry, the example was incomplete. It should be like this:
>>>
>>>     @Test
>>>     public void testReplaceEscapingDollarSign() {
>>>         values.put("amount", "20.00");
>>>
>>>         final StrSubstitutor sub = new StrSubstitutor(values);
>>>         sub.setEscapeChar('<');
>>>
>>>         String replaceTemplate = "The <${animal} jumps over the
>>> ${target}.";
>>>         String expectedResult = "The ${animal} jumps over the lazy dog.";
>>>         String replacedResult = sub.replace(replaceTemplate);
>>>         assertEquals(expectedResult, replacedResult);
>>>
>>>         replaceTemplate = "The ${animal} paid <$${amount} to jump over
>>> the ${target}.";
>>>         expectedResult = "The quick brown fox paid $20.00 to jump over
>>> the lazy dog.";
>>>         replacedResult = sub.replace(replaceTemplate);
>>>         assertEquals(expectedResult, replacedResult);
>>>     }
>>>
>>> The second assertion failed. So, it seems working in case of
>>> "<${animal}", but not working in case of "<$${amount}".
>>>
>>>
>>> testReplaceEscapingDollarSign(org.apache.commons.lang3.text.StrSubstitutorTest)
>>>  Time elapsed: 0.009 sec  <<< FAILURE!
>>> org.junit.ComparisonFailure: expected:<...uick brown fox paid []$20.00
>>> to jump over ...> but was:<...uick brown fox paid [<]$20.00 to jump
>>> over ...>
>>>
>>> Regards,
>>>
>>> Woonsan
>>>
>>> On Thu, Jul 23, 2015 at 10:28 AM, Woonsan Ko <woon...@apache.org> wrote:
>>> > Hi Anthony,
>>> >
>>> > Putting '$20.00' into the map is not an option in my use case, so I
>>> > tried to use a different escape character. But it doesn't seem to be
>>> > working either (another bug?):
>>> >
>>> >     @Test
>>> >     public void testReplaceEscapingDollarSign() {
>>> >         values.put("amount", "20.00");
>>> >
>>> >         final StrSubstitutor sub = new StrSubstitutor(values);
>>> >         sub.setEscapeChar('<');
>>> >
>>> >         String replaceTemplate = "The <${animal} jumps over the
>>> ${target}.";
>>> >         String expectedResult = "The ${animal} jumps over the lazy
>>> dog.";
>>> >         String replacedResult = sub.replace(replaceTemplate);
>>> >         assertEquals(expectedResult, replacedResult);
>>> >
>>> >         //...
>>> >     }
>>> >
>>> > It fails like this:
>>> >
>>> > org.junit.ComparisonFailure: expected:<...uick brown fox paid []$20.00
>>> > to jump over ...> but was:<...uick brown fox paid [<]$20.00 to jump
>>> > over ...>
>>> > at org.junit.Assert.assertEquals(Assert.java:115)
>>> > at org.junit.Assert.assertEquals(Assert.java:144)
>>> > at
>>> org.apache.commons.lang3.text.StrSubstitutorTest.testReplaceEscapingDollarSign(StrSubstitutorTest.java:182)
>>> >
>>> > I think I'd better file a bug regard to escape character handling.
>>> >
>>> > Regards,
>>> >
>>> > Woonsan
>>> >
>>> >
>>> >
>>> > On Wed, Jul 22, 2015 at 9:12 PM, Anthony Brice
>>> > <anthonybr...@lateachiever.com> wrote:
>>> >> It's not a bug---that's a feature! :p
>>> >>
>>> >> From the javadoc: "If this character ['$'] is placed before a variable
>>> >> reference, this reference is ignored and won't be replaced." So even
>>> when
>>> >> you use three dollar signs, you still have a variable reference
>>> >> ("${amount}") with the escape character placed before it, thus the
>>> variable
>>> >> reference will not be replaced.
>>> >>
>>> >> To achieve your desired effect, I think you either have to put the
>>> dollar
>>> >> sign in the mapping (e.g., "values.put("amount", "$20.00"), use
>>> different
>>> >> delimiters, or just set a different escape character.
>>> >>
>>> >> Regards,
>>> >> Anthony Brice
>>> >>
>>> >> On Wed, Jul 22, 2015 at 2:50 PM, Woonsan Ko <woon...@apache.org>
>>> wrote:
>>> >>
>>> >>> Hi there,
>>> >>>
>>> >>> I tried to use the following, expecting "...ick brown fox paid $20.00
>>> >>> to jump over the la…":
>>> >>>
>>> >>>     // In org.apache.commons.lang3.text.StrSubstitutorTest.java
>>> locally
>>> >>>     // after cloning https://github.com/woonsan/commons-lang.
>>> >>>     @Test
>>> >>>     public void testReplaceEscapingDollarSign() {
>>> >>>         values.put("amount", "20.00");
>>> >>>         doTestReplace("The quick brown fox paid $20.00 to jump over
>>> >>> the lazy dog.",
>>> >>>                       "The ${animal} paid $$${amount} to jump over the
>>> >>> ${target}.", true);
>>> >>>     }
>>> >>>
>>> >>> (I put double dollar signs like $$${amount} because $ is the default
>>> >>> escape character.)
>>> >>>
>>> >>> But, the result was:"...ick brown fox paid $${amount} to jump over the
>>> >>> la…".
>>> >>>
>>> >>> Is it a bug or did I miss something?
>>> >>>
>>> >>> Regards,
>>> >>>
>>> >>> Woonsan
>>> >>>
>>> >>> ---------------------------------------------------------------------
>>> >>> To unsubscribe, e-mail: user-unsubscr...@commons.apache.org
>>> >>> For additional commands, e-mail: user-h...@commons.apache.org
>>> >>>
>>> >>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: user-unsubscr...@commons.apache.org
>>> For additional commands, e-mail: user-h...@commons.apache.org
>>>
>>>
>>

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@commons.apache.org
For additional commands, e-mail: user-h...@commons.apache.org

Reply via email to