小编典典

在Java正则表达式中转义特殊字符(不引用)

java

我正在尝试用比Java regex语法更简单的通配符来匹配用户输入。假设有一个通配符A。然后,用户将输入输入字符串:

this ( is \ a $ test.

并将“ test”与搜索字符串匹配:

this ( is \ a $ %A%.

为此,我将搜索字符串中的通配符字符串替换为(.+?),因此我可以将通配符与常规正则表达式的捕获组进行匹配。但是,我仍然希望转义特殊字符。如果我使用引号,则正则表达式将不再起作用,因为带有正则表达式含义的字符((.+?))也被引用了:

String inputString  = "this ( is \\ a $ test."
String searchString = "this ( is \\ a $ %A%."
String regex = Pattern.quote(searchString); 
//regex = "\\Qthis ( is \\ a $ %A%.\\E"
regex = regex.replaceFirst("%A%", "(.+?)");   
//regex = "\\Qthis ( is \\ a $ (.+?).\\E"
Matcher matcher = Pattern.compile(regex).matcher(inputString); //no match

是否有一种内置的方法可以真正转义特殊字符,而不是引用整个字符串?


阅读 345

收藏
2020-11-30

共1个答案

小编典典

您需要找到%A%,用引号括住,用引号括起来,然后用匹配的regex语法替换。

我不确定此通配符的全部要求是什么,但是如果只能%A%,它将看起来像这样:

String searchString = "this ( is \\ a $ %A%.";
String extractorToken = "(.+?)";

int indexOfWildcard = searchString.indexOf("%A%");
String pattern = Pattern.quote(searchString.substring(0, indexOfWildcard)) +
                 extractorToken +
                 Pattern.quote(searchString.substring(indexOfWildcard + 3, searchString.length()));
Matcher matcher = Pattern.compile(pattern).matcher(inputString);

如果通配符可以具有不同的形式,则可以改用正则表达式来定位通配符的位置,然后执行上述操作。

2020-11-30