我创建了以下正则表达式(Java):
(Lord |Lady |Ser )?(Agatha|John)?([ ]??Cain)?
它工作正常,除了一种情况(也许还有我在测试期间没有考虑到的其他情况):
如您所见,当您只有姓氏时,正则表达式也会占用单词后面的空格。我完全明白为什么,但我不知道如何解决它。
此正则表达式用于在代表书籍内容的大文本文件中查找人员。当然,它必须与我当前的工作环境(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/