11

我想找到与我的正则表达式匹配的序列,如果它们位于被空格包围的字符串的中间,最后还是开头,或者是字符串中的唯一内容。

示例: 假设序列'qwe45rty'是我们正在寻找的。我希望能够对所有这些字符串持肯定态度:

'qwe45rty' 'qwe45rty blabla' 'smth qwe45rty blabla' 'smth qwe45rty' ' qwe45rty '

但这些都不是:

'aaqwe45rty' 'qwe45rtybb' 'aaqwe45rtybb'

我想出的最好的东西是这样的:

if ( ($a =~ /\s+$re\s+/) or
     ($a =~ /^$re\s+/)   or
     ($a =~ /\s+$re$/)   or
     ($a =~ /^$re$/)        )
{
    # do stuff
}

这不是最好的方法:)

有什么建议么?

4

3 回答 3

22

您可以在正则表达式中执行or

/(^|\s+)qwe45rty(?=\s+|$)/

正则表达式101

请注意,第二组是正向前瞻 ( ?=),因此它会检查空格,但不会使用它。这样,正则表达式可以匹配两个连续出现的字符串并给出准确的匹配计数。

于 2012-11-05T04:23:19.117 回答
7

尝试从不同的方向解决问题。说某事可以匹配空白或什么都不匹配就是说它不能匹配非空白字符:

(?<!\S)qwe45rty(?!\S)

只需稍微改变一下视角,正则表达式实际上就是自己编写的。

于 2012-11-05T06:13:14.977 回答
1

尝试以下操作:

$a =~ /(?:\A|\s)$re(?:\s|\Z)/;

例如:

use strict;
use warnings;

my $re = 'qwe45rty';
while (<DATA>) {
    chomp;
    print "'$_': Match? " . ( /(?:\A|\s)$re(?:\s|\Z)/ ? 'Yes' : 'No' ) . "\n";
}

__DATA__
qwe45rty
qwe45rty blabla
smth qwe45rty blabla
smth qwe45rty
 qwe45rty 
aaqwe45rty
qwe45rtybb
aaqwe45rtybb

输出:

'qwe45rty': Match? Yes
'qwe45rty blabla': Match? Yes
'smth qwe45rty blabla': Match? Yes
'smth qwe45rty': Match? Yes
' qwe45rty ': Match? Yes
'aaqwe45rty': Match? No
'qwe45rtybb': Match? No
'aaqwe45rtybb': Match? No
于 2012-11-05T04:23:11.860 回答