我有一些文字可能看起来像这样:
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"
什么是仅在“名称”标签后以大写字母开头,在下一个单词以空格后的小写字母开头时结束的正则表达式公式?
答案 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}
jex.im可视化正则表达式:
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])
答案 3 :(得分:0)
当我使用regex101.com进行测试时,此方法有效。请检查并告诉我这是否适合您
/Name is (([\s]*[A-Z][-a-z]*)*)/
第1组有这个William Bob Francis Ford Coppola-Mr-Cool King-Of-The-Mountain
并在下面的此链接上对其进行测试