我想找到与我的正则表达式匹配的序列,如果它们位于由空格包围的字符串的中间,在结尾或开头,或者是字符串中的唯一内容。
示例:
我们假设序列'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
}
这不是最好的方法:)
有什么建议吗?
答案 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