如何使用Perl正则表达式匹配由空格包围的单词或在字符串的结尾/开头?

时间:2012-11-05 04:19:42

标签: regex perl

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

示例: 我们假设序列'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
}

这不是最好的方法:)

有什么建议吗?

3 个答案:

答案 0 :(得分:19)

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

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

答案 1 :(得分:6)

尝试从不同的方向解决问题。要说可以匹配空格,或者没有什么可以说它不能匹配非空白字符:

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

只是一点点转变,正则表达式实际上是自我写作。

答案 2 :(得分: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