首页 文章

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

提问于
浏览
0

我正在尝试将用户输入与比java正则表达式语法更简单的通配符匹配 . 假设有一个通配符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

有没有内置的方法来真正逃避特殊字符,而不是引用整个字符串?

1 回答

  • 1

    你需要找到 %A% ,引用它之前的所有内容,之后的所有内容,并用匹配的正则表达式语法替换它 .

    我不确定这个通配符的完整要求是什么,但如果它只能是 %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);
    

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

相关问题