java - 正则表达式与 & 号不匹配
问题描述
我正在尝试匹配以下正则表达式:
\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中所建议的那样)。为什么这不匹配?
解决方案
如果它位于单词字符之间,则您的正则表达式将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);
在线查看正则表达式演示。
推荐阅读
- scala - scala中模式匹配的时间复杂度是多少?
- google-bigquery - 尝试 UNNEST 时间戳数组字段,但需要 GROUP BY
- arrays - 如何将嵌套循环转换为列表理解?
- c# - 从流中读取,修改字符串并写入文件
- java - 排查purejavahidapi库openDevice函数
- r - 在R中的表中查找第一个值
- python-3.x - 如何运行 python 文件从命令行导入另一个用户定义的模块
- windows-machine-learning - 在 WinML 中加载 ONNX 模型时如何解决“REGDB_E_CLASSNOTREG”错误
- c# - 这个 RestClient JSON POST 的等效 HttpClient JSON POST 是什么?
- javascript - 如何使用 Flask 返回成功的请求?