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

时间:2011-07-15 21:26:23

标签: 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]

我知道如果在两个站点上都有空格,使用:

解析stackoverflow
/\s(stackoverflow)\s/

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

/^(stackoverflow)\s/

/\s(stackoverflow)$/

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

4 个答案:

答案 0 :(得分:142)

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

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

答案 1 :(得分:53)

(^|\s)将匹配空格或字符串的开头,($|\s)表示空格或字符串结尾。它是:

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

答案 2 :(得分:13)

以下是我要使用的内容:

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

换句话说,匹配“stackoverflow”,如果它不是前面的非空白字符,而不是跟随非空白字符。

这比“空间或锚点”方法更整洁(IMO),并且它不假设字符串以\b方法的单词字符开头和结尾。

答案 3 :(得分:7)

\b匹配单词边界(没有实际匹配任何字符),因此以下内容应该符合您的要求:

\bstackoverflow\b