匹配正则表达式中的单词,但仅限于首字母为大写

时间:2017-02-07 14:20:34

标签: regex perl

我有一个动态构建的大型正则表达式,例如缩短的文本示例

my $regex = qr/(daisy|john|fred|june)/is;

my $test = 'Later John said blah and JOHN said ignore john .....';

while( $test =~ /($regex)/g ) {
    warn $1;
}

# Shows all 3 matches

我希望正则表达式匹配'John'OR'JOHN'等的每一次出现,但是如果第一个字母是小写的话,请注意,例如'john'不匹配。

我可以在构建时重复正则表达式的单词,比如

 /(Daisy|DAISY|John|JOHN|Fred|FRED....)/

但是有一些有趣的方法不需要这样做,正则表达式只匹配第一个字母是大写吗?

我可以在一个不区分大小写的匹配之后在正则表达式之外运行第二个检查作为可能的解决方案,如果匹配则忽略它!〜/ [AZ] /或其他什么,但我很想知道是否有在同一个正则表达式中添加额外条件的方式?

2 个答案:

答案 0 :(得分:3)

您可以使用不区分大小写的交替组(使用(?i:...|...))并要求第一个字母为大写字母,其前瞻(?=\p{Lu}) \p{Lu}与大写字母匹配(因此,要求右边的字符应该是大写字母而不消耗它):

#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';

my $regex = qr/(?=\p{Lu})(?i:daisy|john|fred|june)/;

my $test = 'Later John said blah and JOHN said ignore john .....';

while( $test =~ /($regex)/g ) {
    say $1;
}

请参阅online demo

答案 1 :(得分:2)

预先看一下大写的第一个字母:

my $regex = qr/(?=[A-Z])(?i)(daisy|john|fred|june)/s

仅在前瞻后使用不区分大小写的标记。