2017-08-31 8 views
0

文字列:正規表現の単語boundyがこの文字列で機能しないのはなぜですか?

this is something that should work (bs) sdf 

正規表現は

\b\(bs\)\b 

見つかりませ一致を示しません。どうして?

は、ここでは、Rubularである:スペースと()と空間の間に単語境界が存在しないので、そこ一致していませんhttp://rubular.com/r/jX2Hy6O0XG

+0

、通常のヒントを使用していない:あなたは言葉で囲まれていないとき、 ''(BS)と一致する必要がある場合(?<!\ w)\(bs \)(?!\ w) 'を使用してください。 –

+0

あなたの表現に '<!'の意義が何であるか教えてください。 – Anthony

+0

負のルック・バックです。パターンが現在の位置のすぐ左に一致する場合、一致しない。 –

答えて

2

なぜなら、以下のような理由があります。

ワード境界は

(?:       # Cluster start 
     (?:       # ------- 
     ^       # Beginning of string anchor 
     |        # or, 
      (?<= [^a-zA-Z0-9_])   # Lookbehind assertion for a char that is NOT a word 
    )        # ------- 
     (?= [a-zA-Z0-9_])   # Lookahead assertion for a char that is IS a word 

    |        # or, 

     (?<= [a-zA-Z0-9_])   # Lookbehind assertion for a char that is IS a word 
     (?:       # ------- 
      $        # End of string anchor 
     |        # or, 
      (?= [^a-zA-Z0-9_])   # Lookahead assertion for a char that is NOT a word 
    )        # ------- 
)        # Cluster end 

として定義されているので、 \b\(試合を何?

(は言葉ではない場合、\bは左

すなわちに単語を期待しています。 (?<=[a-zA-Z0-9_])(。しかし、スペースの前に来るものは、
ですので、一致しません。

)\bと同じです。つまり、)(?=[a-zA-Z0-9_])ですが、後に続くのはスペースです。

あなたは空白の境界をご希望の場合は、前後に空白やBOS/EOS位置を保証

(?<!\S)(..)(?!\S)を使用すると思います。

か、あなたはを確保する必要がある場合は何の単語境界が負のワード境界

\B(..)\B

+1

すべてがデュプリではない – sln

0

理由があります。

what word boundary matchesを参照してください:最初の文字が単語文字であれば文字列の最初の文字の前に

  • 、:単語の境界としての資格3つの異なる位置があり

  • 文字列の最後の文字の後に、最後の文字が単語文字の場合。
  • 文字列内の2つの文字の間に、1つは単語文字であり、もう1つは単語文字ではありません。

あなたは単語の文字に囲まれていないとき

(?<!\w)\(bs\)(?!\w) 

を使用し、(bs)と一致する必要がある場合はRubular demoを参照してください。

詳細

  • (?<!\w) - リテラル文字列(bs)
  • (?!\w) - - ワードチャー
  • \(bs\)
  • が先行されていない文字列内の位置と一致する負の後読み負先読みその直後に単語charが付いていない場所に一致する。
関連する問題