web-dev-qa-db-ja.com

Wordまたはその表現に一致する正規表現

Word全体で正規表現に一致させたい。

次の例では、sまたはseasonに一致させようとしていますが、seaoおよびnに一致させています。

[s|season]

単語全体に一致するように正規表現を作成する方法

102
NMGod

角括弧は文字クラス用であり、実際にはs|seas(また)、oおよびnのいずれかに一致させようとしています。

グループ化にはかっこを使用してください。

(s|season)

または非キャプチャグループ:

(?:s|season)

注:非キャプチャーグループはエンジンに一致を保存する必要がないことを伝えますが、他のグループ(キャプチャーグループはそうします)はそれを保存します。小さなものであれ、うまくいくものであれ、「ヘビーデューティ」なものであれば、マッチが必要かどうかを最初に確認したいと思うかもしれません。そうでない場合は、使用する必要のないものを保存するのではなく、非キャプチャグループを使用して計算用のメモリを増やしてください。

120
Jerry

あなたのパターンをテストするためにこのライブオンラインの例を使用してください:

enter image description here

このライブ例のスクリーンショットの上: https://regex101.com/r/cU5lC2/1

コマンドライン上の任意のWord全体に一致させます。

私は phpshインタラクティブシェルUbuntu 12.10 に使用して説明します。 PCRE正規表現エンジン として知られている方法で preg_match

Phpshを起動し、内容を変数に入れてWordで一致させます。

el@apollo:~/foo$ phpsh

php> $content1 = 'badger'
php> $content2 = '1234'
php> $content3 = '$%^&'

php> echo preg_match('(\w+)', $content1);
1

php> echo preg_match('(\w+)', $content2);
1

php> echo preg_match('(\w+)', $content3);
0

Preg_matchメソッドは、PHP言語内のPCREエンジンを使用して、変数$content1$content2、および$content3(\w)+パターンで分析しました。

$ content1と$ content2には少なくとも1つのWordが含まれていますが、$ content3には含まれていません。

Wordの境界なしでコマンドライン上の特定の単語を一致させる

el@apollo:~/foo$ phpsh

php> $gun1 = 'Dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'darty gun';
php> $gun4 = 'Unicorn gun';

php> echo preg_match('(Dart|fart)', $gun1);
1

php> echo preg_match('(Dart|fart)', $gun2);
1

php> echo preg_match('(Dart|fart)', $gun3);
1

php> echo preg_match('(Dart|fart)', $gun4);
0

変数gun1gun2には正しいDartまたはfartという文字列が含まれていますが、gun3にはdartyが含まれていてまだ一致しているという問題があります。それでは、次の例に進んでください。

コマンドライン上の特定の単語と単語の境界を一致させます。

単語の境界は\bと強制的に一致させることができます。参照 Visual analysis of what wordboundary is doing from jex.im/regulex

正規表現ビジュアルイメージは http://jex.im/regulex および https://github.com/から取得しましたJexCheng/regulex 例:

el@apollo:~/foo$ phpsh

php> $gun1 = 'Dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'darty gun';
php> $gun4 = 'Unicorn gun';

php> echo preg_match('(\bdart\b|\bfart\b)', $gun1);
1

php> echo preg_match('(\bdart\b|\bfart\b)', $gun2);
1

php> echo preg_match('(\bdart\b|\bfart\b)', $gun3);
0

php> echo preg_match('(\bdart\b|\bfart\b)', $gun4);
0

\bは、 "Dart"は一致しているが "darty"は一致していないことを確認しながら、Wordの境界があると主張しています。

109
Eric Leschinski

私はjsで例をテストします。最も簡単な解決策 - 必要なWordを追加してください/ /:

var reg = /cat/;
reg.test('some cat here');//1 test
true // result
reg.test('acatb');//2 test
true // result

さて、もしあなたが境界を持つこの特定の単語を必要としているならば、他のどんなサイン文字の中にもない。 bマーカーを使います。

var reg = /\bcat\b/
reg.test('acatb');//1 test 
false // result
reg.test('have cat here');//2 test
true // result

Jsにexec()メソッドもあります。これはobject-resultを返します。それはf.g.を助けます私たちの言葉の場所/インデックスについての情報を得るために。

var matchResult = /\bcat\b/.exec("good cat good");
console.log(matchResult.index); // 5

すべてのマッチした単語を文字列/文/テキストで取得する必要がある場合は、g修飾子(グローバルマッチ)を使用できます。

"cat good cat good cat".match(/\bcat\b/g).length
// 3 

今最後のもの - 私は1特定のWordを必要としないが、それらのいくつか。使う記号、それは選択を意味します/または。

"bad dog bad".match(/\bcat|dog\b/g).length
// 1
3
Vasyl Gutnyk

[ ]は文字クラスを定義します。つまり、そこに設定したすべての文字は一致します。 [012]01、または2と一致し、[0-2]は同じように動作します。

あなたが欲しいのは、ORステートメントを定義するためのグルーピングです。あなたの問題には(s|season)を使ってください。

ところで。あなたは気を付けなければならない。通常の正規表現内(またはグループ化内)のメタ文字は、文字クラスとは異なります。文字クラスはサブ言語のようなものです。 [$A]は、$またはAのみに一致し、それ以外は一致しません。ここでドルのために逃げることはありません。