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
>
>

Reply via email to