「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)$/
しかし、正規表現を使用して「スペースまたは文字列の終わり」および「スペースまたは文字列の始まり」をどのように指定しますか?
次のいずれかを使用できます。
\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.
(^|\s)
はスペースまたは文字列の先頭と一致し、($|\s)
はスペースまたは文字列の末尾と一致します。一緒に:
(^|\s)stackoverflow($|\s)
私が使用するものは次のとおりです。
(?<!\S)stackoverflow(?!\S)
言い換えると、precededが非空白文字ではなく、-followedが非空白文字ではない場合、「stackoverflow」に一致します。
これは、「スペースまたはアンカー」アプローチよりもすっきり(IMO)であり、\b
アプローチのように文字列がWord文字で開始および終了することを想定していません。
\b
はWordの境界で(実際には文字と一致せずに)一致するため、次の操作を行う必要があります。
\bstackoverflow\b