1

以下の文字列では、スタンドアロンInc.の s と一致させようとしています。

Inc. aa Inc. bbbInc. Inc.

次の正規表現は機能しませんでした:

/\bInc\.\b/       # got zero matches
/\bInc\.(\b|$)/   # matched the last Inc.

\b単語と非単語文字の境界に一致するためだと思います。ここでは、非単語文字である の\b後に\.あります。動作するように微調整しました。

/\bInc\.($|\W)/
/\bInc\.\B/
  • なぜ4番目の式が機能するのか理解できません。
  • 3 と 4 のうち、エッジ ケースが最も少ないアプローチはどれですか?
  • この問題のより良い解決策はありますか?
4

2 に答える 2

2

一致させたい場合は"Inc."、単語以外の文字が続きます。は単語以外の文字であるため"."、終了境界で予期されるのは\W\Wシーケンス (または文字列の末尾) です。は aまたはシーケンス\bのいずれかの境界に一致するため、その一致は予想される一致と交差しません。\w\W\W\w

4 番目の式が機能するのは、シーケンスまたはシーケンス (または文字列の先頭または末尾)\Bの境界に一致するためです。一致する場合、一致は、必要な (または文字列の末尾) に絞り込まれます。\w\w\W\W\W\.\B\W\W

3 番目と 4 番目の式を比較すると、3 番目の式には 2 つの問題があります。(1)\W文字列に一致することに注意してください。その/\bInc\.($|\W)/ため、必要な部分に続く文字を一致内に含めます。これを回避するには、先読み: を使用できますが/\bInc\.(?=$|\W)/、それに比べて 4 番目の方がはるかに優れています。(2) 特定の例では問題ありませんが、文字列が 1 行を超える$と、文字列の末尾と正しく一致しません。使用する\z方が良いです。

あなたの4番目のものよりも良いものは考えられません.

于 2013-01-30T23:57:29.913 に答える
0

Perl正規表現のドキュメントから

単語境界 (\b) は、一方の側に \w があり、もう一方の側に \W がある 2 つの文字の間のスポットです (どちらの順序でも)。 \W に一致する文字列。

\wを表すため、[a-zA-Z0-9_] \bと一致しません。あなたが正しく仮定するように。

\bInc\.\B

Inc..、または \w 以外の任意の文字に一致Inc.します。

\bInc\.($|\W)

一致させたい場合はInc.、その後に空白または改行を使用します

\bInc\.(\s|$)
于 2013-01-30T23:25:34.283 に答える