我需要 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