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

189

假设你正在尝试匹配模式 "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)$/

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

4个回答

253

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

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

另外,如果您不想将空格包含在匹配中,您可以使用正向/反向预查。

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

12
\b 是一个零宽度断言,它不会消耗任何字符。不需要将其包裹在环视中。 - Alan Moore
3
请注意,在大多数正则表达式实现中,\b 仅支持 标准 ASCII 字符,也就是说,不支持 Unicode。如果您需要匹配 Unicode 单词,则只能使用此方法:https://dev59.com/rGw15IYBdhLWcg3wSJvQ#6713327。 - Mahn
4
排除匹配中的组选择最简单的方法是 (?:^|\s) - sam-6174
10
对于Python而言,将(?<=\s|^)替换为(?:(?<=\s)|(?<=^))。否则,你会得到错误提示:error: look-behind requires fixed-width pattern - sam-6174
7
\b会将其他字符如"."视为单词分隔符,然而提问者明确要求使用空格。@gordy 的解决方案看起来更好。 - Mikhail T.
显示剩余4条评论

100

(^|\s)可以匹配空格或字符串的开头,($|\s)可以匹配空格或字符串的结尾。两者组合起来就是:

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

6
这是唯一适合我的方案。谢谢 @gordy。 - robsonrosa
3
如果你使用这个模式进行替换,请记得通过用模式$1string$2进行替换来保留替换结果中的空格。 - Mahn
1
这也是对我起作用的唯一方法。单词边界似乎永远都不会按我所需的方式工作。首先,它们匹配一些除空格(如破折号)之外的字符。这对我解决了问题,因为我一直在尝试将$^放入字符类中,但这显示它们只能放入常规模式组中。 - felwithe
1
这个很好用,但如果你不想捕获空格,请使用这个:(?:^|\s)stackoverflow(?:$|\s) - Vlax

27

我会使用以下内容:

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

换句话说,当且仅当"stackoverflow"前面没有非空格字符并且后面也没有非空格字符时匹配。

这种方法比“空格或锚点”方法更整洁(我个人认为),而且不像\b方法那样假设字符串以单词字符开头和结尾。


1
好的解释为什么要使用这个。我本来会选择这个,但被测试的字符串始终是单行。 - anonymous-one
1
@LawrenceDol,你是不是指的是(?<=\S)...(?=\S)?请注意大写的\S匹配任何非空格字符。因此,负向先行断言将在那里有一个空格字符或根本没有字符时进行匹配。 - Alan Moore

11

\b匹配单词边界(实际上不匹配任何字符),因此以下内容应该能够满足您的需求:

\bstackoverflow\b

1
对于Python,最好使用原始字符串进行指定(https://docs.python.org/3/reference/lexical_analysis.html#index-19),例如,`mystr = r'\bstack overflow\b'`。 - Asclepius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接