正規表現:「スペースまたは文字列の先頭」と「スペースまたは文字列の末尾」を指定します


127

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

しかし、正規表現を使用して「スペースまたは文字列の末尾」と「スペースまたは文字列の先頭」をどのように指定しますか?

回答:


172

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

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

8
\bゼロ幅アサーションです。キャラクターを消費することはありません。ルックアラウンドでラップする必要はありません。
アランムーア

2
ほとんどの正規表現の実装で\bは、標準のASCIIのみであることに注意してください。つまり、Unicodeはサポートされていません。Unicodeの単語に一致させる必要がある場合は、代わりにこれを使用するしかありません:stackoverflow.com/a/6713327/1329367
Mahn

4
一致からグループ選択を除外する簡単な方法は(?:^|\s)
次のとおり

7
Python用、交換してください(?<=\s|^)(?:(?<=\s)|(?<=^))。それ以外の場合、次のようになりますerror: look-behind requires fixed-width pattern
user2426679

4
\bこうした「など-他の文字を検討する.スペース」「アスカーは、具体的言っ一方、ワードブレーカとして」。@gordyの解決策はより良いようです。
ミハイルT.17年

65

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

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

4
これは私のために働く唯一のものです。ありがとう@gordy
robsonrosa

2
このパターンを使用して置換する場合は、パターンで置換することにより、置換後の結果にスペースが含まれるようにしてください$1string$2
Mahn、2015年

これは私にとっても機能する唯一のものです。言葉の境界は、私が望んでいるようには見えません。1つは、空白文字以外の一部の文字(ダッシュなど)と一致します。私が入れしようとしてきのだので、これは私のためにそれを解決$し、^文字クラスの中に、このショー彼らは規則的なパターンのグループに入れることができます。
felwithe

17

これが私が使うものです:

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

それがいない場合は、他の言葉で、「StackOverflowの」と一致先行の非空白文字としないことによって、その後の非空白文字で。

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


1
これを使用する理由についての良い説明。私はこれを選んだでしょうが、テストされている文字列は常に単一行です。
anonymous-one

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.