Как получить все слова, которые начинаются с заглавной буквы после определенной строки? - PullRequest
6 голосов
/ 11 июня 2019

У меня есть текст, который может выглядеть примерно так:

Name is William Bob Francis Ford Coppola-Mr-Cool King-Of-The-Mountain is a fake name.

Я хотел бы запустить регулярное выражение для этой строки и извлечь

William Bob Francis Ford Coppola-Mr-Cool King-Of-The-Mountain 

в качестве совпадения.

Мое текущее регулярное выражение выглядит следующим образом:

/\b((NAME\s\s*)(((\s*\,*\s*)? *)(([A-Z\'\-])([A-Za-z\'\-]+)*\s*){2,})?)\b/ig

, и оно выполняет большую часть того, что я хочу, но оно не идеально.Вместо того, чтобы просто получить имя, он также получает "is" после имени, подобного этому:

"William Bob Francis Ford Coppola-Mr-Cool King-Of-The-Mountain is a"

Что такое формула регулярного выражения, чтобы получить только слова, начинающиеся с заглавной буквы, следующей за "Name""обозначать и заканчивать, когда следующее слово начинается со строчной буквы после пробела?

Ответы [ 4 ]

4 голосов
/ 11 июня 2019

Как вам нравится /Name ((?:[A-Z]\w+[ -]?)+)/?

Regex101: https://regex101.com/r/BFJBpZ/1

1 голос
/ 11 июня 2019

Вы можете использовать:

Name\b[\sa-z]*\K(?:[A-Z][a-z]+[\s-]*)+(?=\s[a-z])

, где

  • \K сбрасывает начальную точку сопоставления после сопоставления Name, за которой следуют некоторые слова в нижнем регистре
  • (?:[A-Z][a-z]+[\s-]*)+ будет соответствовать всем словам, начинающимся с заглавной буквы
  • (?=\s[a-z]), добавьте ограничение, что следующее слово начинается со строчной буквы

демо: https://regex101.com/r/WBrdFU/1/

Примечания:

вы не должны использовать опцию i в своем регулярном выражении, если вы это делаететак что все ваши классы символов [A-Z] будут одновременно совпадать с заглавными и строчными буквами ... Это помешает вам выбрать слова, начинающиеся с заглавной буквы !!!

Добавление имен с апострофом :

Name\b[\sa-z]*\K(?:[A-Z][a-z'\s-]*?)+(?=\s[a-z])

демо : https://regex101.com/r/WBrdFU/3/

1 голос
/ 11 июня 2019

Я предполагаю, что это простое выражение может сработать, если у нас всегда будет is после желаемого результата:

Name is (.+?) is.+

Тест

use strict;

my $str = 'Name is William Bob Francis Ford Coppola-Mr-Cool King-Of-The-Mountain is a fake name.
';
my $regex = qr/Name is (.+?) is.+/mp;

if ( $str =~ /$regex/g ) {
  print "Whole match is ${^MATCH} and its start/end positions can be obtained via \$-[0] and \$+[0]\n";
  # print "Capture Group 1 is $1 and its start/end positions can be obtained via \$-[1] and \$+[1]\n";
  # print "Capture Group 2 is $2 ... and so on\n";
}

# ${^POSTMATCH} and ${^PREMATCH} are also available with the use of '/p'
# Named capture groups can be called via $+{name}

Демо

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

Рекомендации

здим советует:

Возможно, поскольку это не может быть "есть", просто любое строчное слово (так после граница слова), что-то вроде /\b([A-Z].+?)\b[a-z.!?]/ ... (вероятно, нуждается в доработке, особенно для возможного конца предложения после имени)?

0 голосов
/ 11 июня 2019

Это сработало, когда я тестировал с regex101.com. Пожалуйста, проверьте и дайте мне знать, если это работает для вас

  /Name is (([\s]*[A-Z][-a-z]*)*)/

Группа 1 имеет это William Bob Francis Ford Coppola-Mr-Cool King-Of-The-Mountain

и протестируйте его по этой ссылке ниже

https://regex101.com/r/M2V2in/2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...