2017-08-31 99 views
0

字符串:爲什麼正則表達式的boundy不適用於這個字符串?

this is something that should work (bs) sdf 

正則表達式

\b\(bs\)\b 

顯示沒有找到的匹配。爲什麼?

這是Rubular:http://rubular.com/r/jX2Hy6O0XG

+0

而且通常提示:如果您需要匹配'(BS)'時不使用Word封閉字符,請使用'(?<!\ 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_])但是再一次,後面是空格。

如果你想一個空白的邊界,你會使用

(?<!\S)(..)(?!\S)這確保空格或BOS/EOS位置之前和之後。

,或者,如果你需要確保無字邊界使用負字邊界

\B(..)\B

+1

不是一切都是愚蠢的 – sln

0

有不匹配的原因是因爲有一個空間,()和空間之間沒有字的邊界。

what word boundary matches

有跡象表明,有資格作爲單詞邊界的三個不同位置:

  • 字符串中的第一個字符之前,如果第一個字符是一個單詞字符。
  • 在字符串中的最後一個字符後面,如果最後一個字符是單詞字符。
  • 字符串中的兩個字符之間,其中一個是單詞字符,另一個不是單詞字符。

如果您需要匹配(bs)時不與字字符封閉的,使用

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

看到一個Rubular demo

詳細

  • (?<!\w) - 文字(bs)
  • (?!\w) - - 該位置在沒有前面有一個字字符
  • \(bs\)字符串相匹配的負回顧後負前瞻匹配一個不會立即跟隨單詞char的位置。
相關問題