如何获取所有在特定字符串之后以大写字母开头的单词?

时间:2019-06-10 22:03:57

标签: regex perl

我有一些文字可能看起来像这样:

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 a”:

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

什么是仅在“名称”标签后以大写字母开头,在下一个单词以空格后的小写字母开头时结束的正则表达式公式?

4 个答案:

答案 0 :(得分:4)

您如何喜欢/Name ((?:[A-Z]\w+[ -]?)+)/

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

答案 1 :(得分:1)

我的猜测是,如果我们在期望的输出之后总有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}

Demo

RegEx电路

jex.im可视化正则表达式:

enter image description here

建议

zdim建议:

  

也许不是任何一个“小写”单词(可能不是“是”),所以   字边界),类似/\b([A-Z].+?)\b[a-z.!?]/ ...   (可能需要调整,特别是为了可能的句子结尾   名字之后)?

答案 2 :(得分:1)

您可以使用:

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选项   您的char类[A-Z]将同时匹配大写   字母,还有小写字母...这会阻止您   选择以大写字母开头的单词!

添加带有单引号的名称

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

演示https://regex101.com/r/WBrdFU/3/

答案 3 :(得分:0)

当我使用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