PHP Regex для захвата имен, если префикс с ключевыми словами - PullRequest
0 голосов
/ 11 мая 2018

Мне нужно регулярное выражение 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 = "/ [от | с | из | и | как | наблюдалось |, |.] \ s + ([AZ]. \ w +) / ";
  • $ regex =" /((from со словами of||||||| и Observed|,| .)\s+([AZ]. \ w +)) / ";
  • $ regex =" / \ b (из | с | из | и | как | наблюдалось |, |.) \ s + ([AZ]. \ \ w +) /";
  • $ regex =" /\b(from от с of|| и|as| observed|,|.|\b)\s + ([AZ]. \ \ W +) / ";

Я не могу сделать это только тогда, когда список слов перед именами.Я не могу использовать ^, чтобы проверить «начинается с».Я ужасен в регулярных выражениях и думаю, пока это не сработает.Я чувствую, что решение требует какого-то опосредованного утверждения, хотя я не уверен, как оно работает.

Вывод

Должен быть массивом

  • ['J.Смит "," Б.Миллер ']
  • [' Т.Бейкер ',' М.Келли ']
  • [' Б.Браун »,« Т.Старк, Дж.Maddox ']

ОБНОВЛЕНИЕ

Конечное регулярное выражение

  • $ regex = "/ \ b (?: From | с | of | и | as |наблюдаемый |,) \ s + ([AZ]. \ \ w +) / ";

Кажется, работает с теми немногими документами, которые у меня есть.Спасибо всем !!

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Вы можете использовать эту модифицированную версию вашего третьего регулярного выражения:

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

Вам необходимо выбрать . в первой группе, или он примет любой символ. Не имеет значения послеedit

Флаг \g будет обнаруживать каждое вхождение шаблона, и вы сможете получить доступ к результатам в $matches[1].

(добавление ?: в первую группу предотвращаетего можно захватить, вы можете удалить его, если вам нужно знать ключевое слово, но тогда результаты будут сохранены в $ match [2])

Редактировать: Удалено \. в первой группе, чтобы не соответствовать концупредложений (см. комментарий автора).

0 голосов
/ 11 мая 2018

Я думаю, что это должно работать

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

Где

?!= Отменить совпадение первой группы, которое начинается с первого ( и заканчивается ) и, по крайней мере, включает в себя также \ s (пробел) в начале имени.

^ = match начинается строки / предложения / строки

Затем во второй группе она должна соответствовать только одной заглавной букве {1,}, а затем точке \., пробелу \s ислово \w

В конце /g означает «глобальный поиск»

https://regexr.com/3pa9o

0 голосов
/ 11 мая 2018

Вы можете попробовать найти заглавную букву, за которой следуют точка и слово

[A-Z]\.\s\w+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...