2017-02-12 11 views
2

気にしない正規表現で改行を無視here at scriptular.com私は正規表現を持っているため

/(?=.*net)(?=.*income)(?=.*total)(?=.*depreciation)/i 

は、どのように私は正規表現が正常に文字列に一致するのですか?

文字列に改行文字がないと、正規表現は成功します。私はそれらを取り除くことができる...しかし、私はむしろそうしたくない。

+1

これらの単語だけをマッチさせたいですか? –

+0

私はregexマッチグループについて気にしません、私はregexObj.test(str)を使用して、文字列に必要なものが含まれているかどうかを確認したいだけです。はい、私は与えられた例の言葉を気にします。 – markain

+1

JSでは、ドットマッチ改行を行うためのフラグはありません。回避策は['[\ s \ S]'、 '[\ w \ W]'または '[^]'(https://www.regex101.com/r/hEeXMg/1)の使用です。タイムアウトを避けるには、先読みを '^'開始に固定し、 '*'の後ろに '?'を置いて[lazy matching](http://www.regular-expressions.info/repeat.html#lazy)を使用することも検討してください。 –

答えて

2

1.)dotは、改行以外の任意の文字に一致します。目的の単語が最初の単語の後の行で一致する場合、改行をスキップしません。多くの正規表現のフレーバーには、dotallまたは単線​​ - flagがあります。ドットも改行に一致しますが、残念ながらJS Regexではありません。

回避方法は、任意の文字を含むcharacter classを使用することです。このような任意の非単語文字ない何も代わりにドットののためにも[^]と一緒に任意の単語文字のための任意の非空白\Sまたは[\w\W]\s一緒[\s\S]任意の空白文字として。

2.)Anchor先読みは^になります。文字列の任意の位置で先読みを繰り返すことは望ましくないため、文字列の開始を指定します。これにより、パフォーマンスが大幅に向上します。

3.)各単語の最初の一致に満足するためにlazy matchingを使用してください。

/^(?=[\s\S]*?net)(?=[\s\S]*?income)(?=[\s\S]*?total)(?=[\s\S]*?depreciation)/i 

See demo at regex101(知らんなぜこれはあなたのデモツールでは動作しません)

さらにあなたがそのようなnetなどを確認することのための単語の周り\b word boundariesを使用することができますがbrunetnetworkにマッチされることはありません。..正規表現は^(?=[\s\S]*?\bnet\b)になります...

関連する問題