PHP 正则表达式用于捕获前缀为关键字的名称



我需要 PHP 正则表达式来捕获文本文档中列出的人员的第一个首字母和姓氏。 但仅当句子或行包含几个关键字时,才捕获名称。(来自、与、的和,如观察到的(。 我当前的尝试捕获列表项,即。 "A. General"或"B. Issues",因为它似乎并不关心名字前面的内容。

我一直在使用 preg_match_all(( 希望它返回一个名称数组。(名字首字母,姓氏(。

示例文本

"from J. Smith and B. Miller"
"as T. Baker observed M. Kelly"
"We inquired with B. Brown, T. Stark and J. Maddox."

我试过了

  • $regex = "/[from|with|of|and|as|observed|,|.]\s+([A-Z]. \w+(/";
  • $regex = "/((from|with|of|and|as|observed|,|.(\s+([A-Z]. \w+((/";
  • $regex = "/\b(from|with|of|and|as|observed|,|.(\s+([A-Z].\ \w+(/";
  • $regex = "/\b(from|with|of|and|as|observed|,|.|\b(\s+([A-Z].\ \w+(/";

我不能只在单词列表在名称之前捕获它。 我不能使用 ^ 来检查"开头为"。 我对正则表达式很糟糕,直到它起作用。 我觉得解决方案需要某种回顾断言,尽管我不确定它是如何工作的。

输出

应该是一个数组

  • [ "J. Smith", "B. Miller" ]
  • [ "T. 贝克"、"M. 凯利" ]
  • [ "B. 布朗"、"T. 斯塔克"、"J. 马多克斯" ]

更新

最终正则表达式

  • $regex = "/\b(?:from|with|of|and|as|observed|,(\s+([A-Z].\ \w+(/";

似乎适用于我拥有的少数文档。 谢谢大家!!

您可以使用第三个正则表达式的修改版本:

b(?:from|with|of|and|as|observed|,)s+([A-Z]. w+)g

您需要在第一组中转义.,否则它将接受任何字符。编辑后不相关

g标志将找到模式的每个匹配项,您将能够在$matches[1]中访问结果。

(第一组中添加的?:阻止它被捕获,如果需要知道关键字,可以将其删除,但随后结果将存储在$matches[2](

编辑:删除了第一组中的.,以不匹配句子的结尾(请参阅作者评论(。

您可以尝试查找大写字母,后跟点和单词

[A-Z].sw+

我认为这应该有效

/(?!^from|with|of|and|as|observed|s)([A-Z]{1,}.sw*)/g

哪里

?! = 丢弃第一组的匹配项,该匹配项以第一个(开头,以)结尾,至少还包括名称开头的 \s(空格(。

^ = 匹配行/句子/字符串的开头

然后在第二组中,它应该只匹配一个大写字母{1,}然后是一个点.,一个空格s和单词w

末尾的/g代表"全局搜索">

https://regexr.com/3pa9o

相关内容

最新更新