首页 > 解决方案 > 正则表达式与 & 号不匹配

问题描述

我正在尝试匹配以下正则表达式:

\b(?:mr|mrs|ms|miss|messrs|mmes|dr|prof|rev|sr|jr|&|and)\.?\b

换句话说,单词边界后跟上面的任何字符串(可选地后跟句点字符),然后是单词边界。

我正在尝试在 Java 中匹配它,但与号不匹配。例如:

Pattern p = Pattern.compile(
        "\\b(?:mr|mrs|ms|miss|messrs|mmes|dr|prof|rev|sr|jr|&|and)\\.?\\b", 
        Pattern.CASE_INSENSITIVE);
    
String result = p.matcher("mr one and mrs.two and three & four").replaceAll(" ");
    
System.out.println("["+result+"]");

这个的输出是:[ one two three & four]

我也在 regex101 上试过这个,和符号也不匹配:https ://regex101.com/r/klkmwl/1

转义 & 号并没有什么不同,我尝试使用十六进制转义序列\x26而不是 & 号(如this question中所建议的那样)。为什么这不匹配?

标签: javaregex

解决方案


如果它位于单词字符之间,则您的正则表达式three&four匹配一个&符号,例如,请参阅此正则表达式演示。发生这种情况是因为\b在非单词 char 之前需要一个单词 char 出现在它之前。此外,由于\b在可选点之后有一个,因此只有在左侧紧接单词 char 时,点和 & 才会匹配。

您需要重新编写模式,以便将单词边界应用于单词而不是符号:

Pattern p = Pattern.compile(
        "(?:\\b(?:mr|mrs|ms|miss|messrs|mmes|dr|prof|rev|sr|jr|and)\\b|&)\\.?", 
        Pattern.CASE_INSENSITIVE);

在线查看正则表达式演示


推荐阅读