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 <
[email protected]> 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 <[email protected]> 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 <[email protected]> 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
>> > <[email protected]> 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 <[email protected]>
>> 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: [email protected]
>> >>> For additional commands, e-mail: [email protected]
>> >>>
>> >>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [email protected]
>> For additional commands, e-mail: [email protected]
>>
>>
>