为什么正则表达式单词不能用于此字符串?

时间:2017-08-31 20:34:05

标签: regex

字符串:

this is something that should work (bs) sdf

正则表达式

\b\(bs\)\b

显示未找到匹配项。为什么呢?

这是Rubular上的:http://rubular.com/r/jX2Hy6O0XG

2 个答案:

答案 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 :(得分:0)

不匹配的原因是因为空格与()以及空格之间没有字边界。

请参阅what word boundary matches

  

有三种不同的职位符合词边界:

     
      
  • 在字符串中的第一个字符之前,如果第一个字符是单词字符。
  •   
  • 在字符串中的最后一个字符之后,如果最后一个字符是单词字符。
  •   
  • 字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。
  •   

如果您需要在未附加字词字符时匹配(bs),请使用

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

查看Rubular demo

<强>详情

  • (?<!\w) - 一个负面的lookbehind,匹配字符串中没有单词char的位置
  • \(bs\) - 文字(bs)字符串
  • (?!\w) - 与未立即跟随字词char的位置匹配的否定前瞻。