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

または正規表現内で実行できます。

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

正規表現101

2 番目のグループは肯定的な先読み ( ?=) であるため、空白をチェックしますが、消費しないことに注意してください。そうすれば、正規表現は文字列の 2 つの連続した出現を照合し、正確な一致数を得ることができます。

于 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 に答える