如何指定"空格或字符串结尾"和"空格或字符串的开头"?

ano*_*one 115 regex preg-match

成像您正在尝试模式匹配"stackoverflow".

您需要以下内容:

 this is stackoverflow and it rocks [MATCH]

 stackoverflow is the best [MATCH]

 i love stackoverflow [MATCH]

 typostackoverflow rules [NO MATCH]

 i love stackoverflowtypo [NO MATCH]
Run Code Online (Sandbox Code Playgroud)

我知道如果解析s​​tackoverflow如果它在两个站点上都有空格使用:

/\s(stackoverflow)\s/
Run Code Online (Sandbox Code Playgroud)

如果它在字符串的开头或结尾处是相同的:

/^(stackoverflow)\s/

/\s(stackoverflow)$/
Run Code Online (Sandbox Code Playgroud)

但是如何指定"空格或字符串结尾"和"空格或字符串的开头"?

Jac*_*ers 151

您可以使用以下任何一种方法:

\b      #A word break and will work for both spaces and end of lines.
(^|\s)  #the | means or. () is a capturing group. 


/\b(stackoverflow)\b/
Run Code Online (Sandbox Code Playgroud)

此外,如果您不想在匹配中包含空格,则可以使用lookbehind/aheads.

(?<=\s|^)         #to look behind the match
(stackoverflow)   #the string you want. () optional
(?=\s|$)          #to look ahead.
Run Code Online (Sandbox Code Playgroud)

  • `\ b`是零宽度断言; 它永远不会消耗任何角色.没有必要将它包裹起来. (8认同)
  • 对于python,将`(?<=\s | ^)`替换为`(?:(?<=\s)|(?<= ^))`.否则,你得到'错误:后视需要固定宽度模式` (7认同)
  • 从匹配中排除组选择的更简单方法是`(?:^ |\s)` (4认同)
  • 请注意,在大多数 regexp 实现中,`\b` 是**标准 ASCII only**,也就是说,不支持 unicode。如果您需要匹配 unicode 单词,您别无选择,只能使用它:http://stackoverflow.com/a/6713327/1329367 (3认同)
  • “ \ b”会考虑其他字符-例如“`。”作为断字符,而问问者专门说“空格”。@gordy的解决方案似乎更好。 (2认同)

gor*_*rdy 58

(^|\s)将匹配空格或字符串的开头以及($|\s)空格或字符串结尾.它是:

(^|\s)stackoverflow($|\s)
Run Code Online (Sandbox Code Playgroud)

  • 这是唯一适合我的.谢谢@gordy (3认同)
  • 如果使用此模式替换,请记住通过替换模式`$ 1string $ 2`来保留替换结果中的空格. (2认同)

Ala*_*ore 14

这是我会用的:

 (?<!\S)stackoverflow(?!\S)
Run Code Online (Sandbox Code Playgroud)

换句话说,匹配"stackoverflow"(如果它之前没有非空白字符,并且后面没有非空白字符).

这比"空间或锚点"方法更整洁(IMO),并且它不假设字符串以类似于\b方法的字符开头和结尾.


And*_*ark 7

\b 在单词边界匹配(没有实际匹配任何字符),所以以下应该做你想要的:

\bstackoverflow\b
Run Code Online (Sandbox Code Playgroud)