2016-11-30 18 views
0

私は正規表現のPerlの正規表現の単語境界等価

\ba 

(?<!\w)a 

と同等ですが、その前に、私は多分

^a|\Wa 

があまりにも同等であることを考え出していたことを読んで

質問:Wha tはそれらの2つの違いですか?誰かが等価でない場合は、例を書くことができますか?

+0

'(?<!\ w)'は単語の先頭にのみ一致し、 '\ b'は単語の両端にアサートされます。 – dawg

+0

@dawgはいですが、 'a'は単語文字です。つまり、' \ ba'では '\ b'は非単語が左側にある場合のみで満足できます。 – hobbs

答えて

2

\bので

\ba(?:(?<!\w)(?=\w)|(?<=\w)(?!\w))aと同等であるので、

\ba(?<!\w)aaためマッチ\wに相当し、(?:(?<!\w)(?=\w)|(?<=\w)(?!\w))と等価です。


両方\ba(?<!\w)aは時折交換可能であるという点に両方^a|\Wa(?:^|\W)aに類似しているが、前者の二つの単一文字に一致し、後者の二つは、2つに一致することができるので、それらが異なっています。比較:これは、彼らは同じではありませんなぜ私が提供できる最短一例である!a

と一致します!a ^a|\Waながら

say '[email protected]#$' =~ s/\ba//r;   # [email protected]#$ 

say '[email protected]#$' =~ s/(?<!\w)a//r; # [email protected]#$ 

say '[email protected]#$' =~ s/^a|\Wa//r;  # !#$ 

say '[email protected]#$' =~ s/(?:^|\W)a//r; # !#$ 
+0

別の例: 'say for '!! a !!' =〜/(!| \ ba)/ g; ' – ikegami

+0

私は部分文字列を扱いませんが、文字列全体が一致するだけの場合、私の"解決策 "は大丈夫ですか?どう思いますか?私は、L(正規表現)セットだけを認識するNFAを書いています。 –

+0

いいえ、 "a" =〜/^[x!](?:\ ba | b)\ z /? "一致": "一致しませんでした"; (これは '\ b'なしでパターンを書き換えることは不可能ではありません。) – ikegami

0

\baは、文字列のaと一致します。

+0

'!'は非単語文字なので、間違っていると思います。正規表現 '\ Wa'は文字列'!a'と一致します。 –

+0

あなたは正しいです、私はそれを後ろに書きました。 –

関連する問題