web-dev-qa-db-ja.com

正規表現:「スペースまたは文字列の開始」および「スペースまたは文字列の終了」を指定します

「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)$/

しかし、正規表現を使用して「スペースまたは文字列の終わり」および「スペースまたは文字列の始まり」をどのように指定しますか?

108
anonymous-one

次のいずれかを使用できます。

\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.
143
Jacob Eggers

(^|\s)はスペースまたは文字列の先頭と一致し、($|\s)はスペースまたは文字列の末尾と一致します。一緒に:

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

私が使用するものは次のとおりです。

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

言い換えると、precededが非空白文字ではなく、-followedが非空白文字ではない場合、「stackoverflow」に一致します。

これは、「スペースまたはアンカー」アプローチよりもすっきり(IMO)であり、\bアプローチのように文字列がWord文字で開始および終了することを想定していません。

13
Alan Moore

\bはWordの境界で(実際には文字と一致せずに)一致するため、次の操作を行う必要があります。

\bstackoverflow\b
7
Andrew Clark