2016-10-04 9 views
0

フレーズの配列を持っていて、文字列にフレーズが含まれているかどうかを検出しようとしています。私は現在、次の正規表現を使用しています:JS Regex:フレーズの一致リスト(ハッシュ記号を含む)

var arrOfWords = ['foo', 'bar', 'foo bar'] 
var regEx = new RegExp('\\b(' + arrOfWords.join('|') + ')\\b', 'gi') 

console.log(regEx) 
/\b(foo|bar|foo bar)\b/gi 

私はサブストリングを含めるしたくなかったので、私は\bを使用ではなく、完全な単語/フレーズ、すなわち 「foo」が「foobarに」と一致していないはずですが、これは素晴らしい作品「私がfooが好き」

と一致する必要があります、しかし、単語の境界は、\b\bは英数字で境界を起動すると、#で始まるフレーズを無視します。

「#hashtag」は、アレイ内にある場合テストされている文字列は「ハッシュタグ」を持っているのであれば、それだけマッチします、ではない「#hashtag」

私が本当に探していると、その正規表現になりますシンボルやハッシュなど、配列に指定されたフレーズ全体と一致します。あるいは、これを回避できる解決策かもしれません。

誰でも正しい方向に向けることができますか?ありがとう。

答えて

1

残念ながら、JSにはルックバックがないため、その文字をマッチに含めることなく直前の文字のプロパティを照合することはできません(ごく限られた使用であることに注意してください)。これがあなたに受け入れられるならば、あなたは:

/(?:^|\W)(foo|bar|foo bar|#hashtag)(?=$|\W)/ 

を持つことができ、最初の捕獲グループを扱うことができます。完全な単語/句だけが必要な場合は、重複しないことが保証されています。非単語セパレータであることが保証されています。

NB:arrOfWordsには、正規表現に意味のある文字列が含まれていると、そのように解釈されます。 foo.barfoosbarと一致します。それを避ける方法については、hereを参照してください。

こんにちは、これは私にとって90%ありがとうございます。ちょうどニットピックに、私はarrOfWords#hashtagが含まれている場合、文字列の##hashtagと一致することに気付きました。ハッシュの数が正確である場合にのみマッチングの方法がありますか?

次に、単語と非単語の文字について明示する必要があります。\Wをそれに置き換えてください。

/(?:^|[^\w#'-])(foo|bar|foo bar|#hashtag)(?=$|[^\w#'-])/ 
+0

こんにちは、これは私にとって90%ありがとうございます。ちょうどニットピックに、私は 'arrOfWords'に'#hashtag'が含まれていれば、文字列中の '## hashtag'と一致することに気付きました。ハッシュの数が正確である場合にのみマッチングの方法がありますか? –

+0

@ /(?:^ | \ s)(foo | bar | foo bar | #hashtag)(?= $ | \ s)/ ' –

+0

@WiktorStribiżew:あまりにも制限があるかもしれないOPだけが伝えることができます)。たとえば、Eleanorによると、「#hashtag is trending」はあなたのものとは一致しませんが、私の場合はそうです。 – Amadan

関連する問題