回答:
角カッコは文字クラスのために意図されている、とあなたは、実際のいずれかに一致するようにしようとしている:s
、|
、s
(再び)、 、e
、a
(s
再び)、o
およびn
。
グループ化の代わりに括弧を使用してください:
(s|season)
または非キャプチャグループ:
(?:s|season)
注:非キャプチャグループは、一致を保存する必要がないことをエンジンに通知しますが、他のグループ(キャプチャグループは保存します)を通知します。小さなものの場合は機能しますが、「ヘビーデューティー」の場合は、マッチが必要かどうかを最初に確認することをお勧めします。そうでない場合は、使用する必要のないものを保存するのではなく、非キャプチャグループを使用して計算用により多くのメモリを割り当てることをお勧めします。
?:
別名グループの内部non-capturing
だけでは、あなたがに合わせた表現を使用することができないことを、言って$1
、$2
そしてそうで...あなたは表現が一致していないことをしたい場合は、何が必要です^
。
(?! ... )
insead、つまり(?!s|season)
この場合を使用します。
このライブの例から取られたスクリーンショットの上:https : //regex101.com/r/cU5lC2/1
私が使用していますphpsh対話型シェル上のUbuntu 12.10を実証するPCREの正規表現エンジンをとして知られている、方法をするpreg_match
phpshを起動し、一部のコンテンツを変数に入れ、単語を照合します。
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つの単語が含まれ、$ content3には含まれません。
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
変数gun1
とgun2
文字列が含まれている、dart
またはfart
正しい文字列が含まれていますが、gun3にはdarty
まだ文字列が含まれていますが、それが問題です。次の例に移りましょう。
単語境界はと強制的に一致させることができます\b
。以下を参照してください。
http://jex.im/regulexおよびhttps://github.com/JexCheng/regulexから取得したRegex Visual Image 例:
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
私たちは必ず「ダーツ」を作り、ワード境界を持って一致したが、「DARTYが」ではないと主張しています。
私はjsで例をテストします。最も簡単な解決策-必要な単語を/ /に追加してください:
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を返します。これは、fgが単語の場所/インデックスに関する情報を取得するのに役立ちます。
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つの特定の単語ではなく、いくつかの単語が必要です。使用しています| 記号、それは選択/またはを意味します。
"bad dog bad".match(/\bcat|dog\b/g).length
// 1
[ ]
文字クラスを定義します。そこで設定したすべてのキャラクターが一致します。orまたはor と[012]
一致し、同じように動作します。0
1
2
[0-2]
必要なのは、orステートメントを定義するためのグループ化です。(s|season)
あなたの問題に使用します。
ところで あなたは注意する必要があります。通常の正規表現(またはグループ内)のメタ文字は、文字クラスとは異なります。文字クラスはサブ言語のようなものです。[$A]
一致するのは$
or のみでA
、それ以外は何もありません。ドルのためにここから逃げることはできません。
(season|s)
代わりに使用してください。[season]
のいずれかと一致しますs
、e
、a
、o
、n
。