Регулярное выражение: укажите "пробел или начало строки" и "пробел или конец строки" - PullRequest
106 голосов
/ 16 июля 2011

Представьте, что вы пытаетесь сопоставить шаблон с "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 ]

142 голосов
/ 16 июля 2011

Вы можете использовать любое из следующих действий:

\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.
53 голосов
/ 16 июля 2011

(^|\s) будет соответствовать пробелу или началу строки и ($|\s) для пробела или конца строки. Вместе это:

(^|\s)stackoverflow($|\s)
13 голосов
/ 16 июля 2011

Вот что я бы использовал:

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

Другими словами, сопоставьте «stackoverflow», если оно не , за которым предшествует непробельный символ, а не , за которым следует непробельный символ.

Это точнее (IMO), чем подход "пробел или якорь", и он не предполагает, что строка начинается и заканчивается символами слов, как подход \b.

7 голосов
/ 16 июля 2011

\b соответствует границам слова (без совпадения каких-либо символов), поэтому следующее должно делать то, что вы хотите:

\bstackoverflow\b
...