正则表达式:指定“空格或字符串开头”和“空格或字符串结尾”


127

想象一下,您正在尝试模式匹配“ 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]

我知道如何解析出stackoverflow,如果它在两个站点上都有空格,则使用:

/\s(stackoverflow)\s/

与它在字符串开头或结尾处相同:

/^(stackoverflow)\s/

/\s(stackoverflow)$/

但是,如何使用正则表达式指定“空格或字符串结尾”和“空格或字符串开头”?

Answers:


172

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

\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/

另外,如果您不想在比赛中加入空格,则可以使用lookbehind / aheads。

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

8
\b是零宽度的断言;它从不消耗任何字符。无需将其包装在环顾四周中。
艾伦·摩尔

2
请注意,在大多数regexp实现中,\b标准ASCII,即不支持unicode。如果您需要匹配unicode字,则别无选择,只能改用它:stackoverflow.com/a/6713327/1329367
Mahn 2015年

4
排除来自匹配组选择更简单的方法是(?:^|\s)
user2426679

7
对于python,请替换(?<=\s|^)(?:(?<=\s)|(?<=^))。否则,您会收到error: look-behind requires fixed-width pattern
user2426679 '16

4
\b会考虑其他字符-如“ .”的字断路器,而提问者明确表示“空间”。@gordy的解决方案似乎更好。
Mikhail T.

65

(^|\s)将匹配空格或字符串开头,以及($|\s)空格或字符串结尾。在一起是:

(^|\s)stackoverflow($|\s)

4
这是唯一对我有用的。谢谢@gordy
robsonrosa 2014年

2
如果您使用此模式进行替换,请记住通过使用模式进行替换,以使空格保留在替换结果中$1string$2
Mahn 2015年

这也是唯一对我有用的。单词边界似乎从来没有做我想要的。首先,它们匹配空格以外的一些字符(例如破折号)。这解决了这个问题对我来说,因为我一直在试图把$^成字符类,但这个节目,他们正好可以放入一个规律组。
felwithe

17

这是我会用的:

 (?<!\S)stackoverflow(?!\S)

换句话说,如果它不匹配“计算器” 之前由非空白字符,而不是跟着一个非空白字符。

这种方法(IMO)比“空格或锚定”方法更整洁,并且不像该\b方法那样假定字符串以单词字符开头和结尾。


1
为什么要使用它的很好的解释。我会选择这个,但是被测试的字符串总是一行。
匿名一,

7

\b 在单词边界处匹配(实际上不匹配任何字符),因此以下操作应满足您的要求:

\bstackoverflow\b

对于Python,它有助于为其指定一个原始字符串,例如mystr = r'\bstack overflow\b'
Acumenus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.