java - 正则表达式将名字/姓氏与可选标题相匹配

标签 java regex match

我创建了以下正则表达式(Java):

(Lord |Lady |Ser )?(Agatha|John)?([ ]??Cain)?

它工作正常,除了一种情况(也许还有我在测试期间没有考虑到的其他情况):

enter image description here

如您所见,当您只有姓氏时,正则表达式也会占用单词后面的空格。我完全明白为什么,但我不知道如何解决它。

此正则表达式用于在代表书籍内容的大文本文件中查找人员。当然,它必须与我当前的工作环境(Java)兼容。

最佳答案

您可以使用正则表达式回溯来实现您的目标。

\b(?<!\S)(?:(Lord|Lady|Ser)\s+)?(Agatha|John)?(?:\s*(?<=\b)(Cain))?(?<=\S)\b @ regex101

它具有这些似乎符合(可能超出)您的标准的品质:

  • 正则表达式匹配强制以非空白字符开头。
  • 第一个捕获将是标题(或空)。
  • 第二次捕获将是第一个名称(或空)。
  • 第三个捕获将是姓氏(或空)。
  • 所有匹配项都没有前导或尾随空格。
  • 此外,它甚至可以通过换行进行匹配(如链接的正则表达式测试示例中的附加文本所示)。
  • 头衔、名字和姓氏位于单个组中,因此向匹配集添加内容就像向各自的组添加额外的替代项一样简单。
  • 还添加了坚持以非空白结尾的匹配的尾部回顾,以避免仅匹配其他不匹配的“Lord X”的“Lord”。

带有示例数据的 regex101 fiddle 已链接到正则表达式。

关于java - 正则表达式将名字/姓氏与可选标题相匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34471544/

相关文章:

arrays - 在 NSDate 数组中查找匹配项 - Swift

angularjs - 单击刷新时,状态参数值与 angularjs 中 UI-Router 中的 url 混合

java - 获取 Java.io.FileNotFoundException;在程序中并且不知道如何修复

java - 线程 join() 方法输出困惑

java - Hudson 不使用 Maven 生成的类路径?

java - java中的同步重新排序

Mysql 匹配排名

c# - 将名称拆分为字段?

javascript - 正则表达式捕获html内容

c# - 根据自定义格式验证字符串