gpt4 book ai didi

java - 在 Java 正则表达式中处理美元字符的最佳方法

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:58:31 25 4
gpt4 key购买 nike

我有以下类 PlaceHolderConverter 用于将 "my {} are beautiful" 之类的字符串解析为带有填充变量的字符串。

例如 new PlaceHolderConverter("\\{\\}").format("my {} are beautiful", "flowers") 将返回字符串 "my flowers are美丽”

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();
}
}

正如您在以下测试中看到的,我对特殊字符美元有疑问,因为它是 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

最佳答案

替换固定字符串时,无需调用 String 的正则表达式方法,因为有一个更简单的方法:input.replace("$", "\\$");。使用这种方法,您不会遇到任何由美元符号的特殊含义引起的麻烦,而且作为奖励,它会(非常轻微)更快。

关于java - 在 Java 正则表达式中处理美元字符的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13031226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com