2017-08-31 95 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的位置。
相关问题