2011-07-15 15 views
71

イメージングは​​ "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(statckoverflow)\s/ 

同じであればそのの開始または終了時文字列:

/^(stackoverflow)\s/ 

/\s(stackoverflow)$/ 

「スペースまたは文字列の終わり」と「スペースまたは文字列の開始」はどのように指定しますか?

答えて

110

あなたは、次のいずれかの使用することができます。

をあなたは試合中にスペースを含めない場合
\b  #A word break and will work for both spaces and end of lines. 
(^|\s) #the | means or.() is a caputuring group. 


/\b(stackoverflow)\b/ 

また、あなたが後読み/先読みを使用することができます。ここで

(?<=\s|^)   #to look behind the match 
(stackoverflow) #the string you want.() optional 
(?=\s|$)   #to look ahead. 
+6

'\ b'はゼロ幅アサーションです。それはどんな文字も消費しません。それをラップアラウンドする必要はありません。 –

+0

良い点。私は彼の元の '\ s'について考えていました。私は私の答えを調整します。 –

+0

ほとんどのregexpの実装では、 '\ b'は**標準のASCIIだけです**、つまりUnicodeサポートはありません。あなたはユニコード言葉を一致させる必要がある場合は、代わりにこれを使用するしかない。http://stackoverflow.com/a/6713327/1329367 – Mahn

41

(^|\s)は、スペースまたは文字列の末尾のスペースや文字列の先頭と($|\s)にマッチします。一緒にそれはです:

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

これは私の作品唯一のものです。 @ gordyありがとう – robsonrosa

+2

このパターンを置き換える場合は、置き換えられた結果のスペースを '$ 1string $ 2'パターンに置き換えてください。 – Mahn

5

\b(実際には任意の文字にマッチせず)は、ワード境界でマッチするので、次はあなたが欲しいものを行う必要があります。

\bstackoverflow\b 
+0

AFAIKは非ラテン語では機能しません。 – Uri

10

は、私が使用するものです。つまり

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

、マッチ「StackOverflowの」それはは非空白文字でを先行していないといないは非空白文字でに従った場合キャラクター。

これは "space-or-anchor"アプローチよりもきれいであり、\bアプローチのように文字列の開始と終了を単語の文字では想定していません。

+1

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

関連する問題