我有以下類PlaceHolderConverter
用於將字符串如"my {} are beautiful"
解析爲具有填充變量的字符串。在java正則表達式中處理美元字符的最佳方法
例如new PlaceHolderConverter("\\{\\}").format("my {} are beautiful", "flowers")
將返回字符串"my flowers are beautiful"
。
package something;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PlaceHolderConverter
{
public Pattern lookForVar;
public PlaceHolderConverter(String placeHolder)
{
this.lookForVar = Pattern.compile(placeHolder);
}
public String format(String text, String... args)
{
if (args == null || args.length == 0)
{
return text;
}
StringBuffer stringBuffer = new StringBuffer();
Matcher matcher = lookForVar.matcher(text);
short varCount = 0;
while (matcher.find())
{
matcher.appendReplacement(stringBuffer, args[varCount++]);
}
matcher.appendTail(stringBuffer);
return stringBuffer.toString();
}
}
正如你在下面的測試中看到的,我對特殊字符dollar有問題,因爲它是java正則表達式的特殊字符。 我試圖用Pattern.quote()
來解決這個問題,但沒有結果。
package something;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import java.util.regex.Pattern;
public class PlaceHolderConverterTest
{
private PlaceHolderConverter placeHolderConverter;
@Before
public void before()
{
placeHolderConverter = new PlaceHolderConverter("\\{\\}");
}
@Test // SUCCESS
public void whenStringArgsThenReplace()
{
String result = placeHolderConverter.format("My {} are beautifull", "flowers");
Assert.assertEquals("My flowers are beautifull", result);
}
@Test // FAIL IllegalArgumentException illegal group reference while calling appendReplacement
public void assertEscapeDollar()
{
String result = placeHolderConverter.format("My {} are beautiful", "flow$ers");
Assert.assertEquals("My flow$ers are beautiful", result);
}
@Test // FAIL IllegalArgumentException illegal group reference while calling appendReplacement
public void assertEscapeDollarWithQuote()
{
String result = placeHolderConverter.format("My {} are beautiful", Pattern.quote("flow$ers"));
Assert.assertEquals("My flow$ers are beautiful", result);
}
}
我也試過正則表達式中使用它,喜歡的東西.replaceAll("\\$", "\\\\$")
之前,需要手動逃離美元,但似乎不喜歡replaceAll
不得不ARG1列入ARG2。
我該如何解決這個問題?
補丁可以在這裏提供https://gist.github.com/3937872
使用簡單的'replace'功能,以取代固定的字符串:'s.replace( 「$」, 「\\ $」);' –
而當串有多個塊錢? – tbruyelle
一個電話就夠了。查看Javadoc並嘗試一下。 –