単語またはそのプレフィックスに一致する正規表現


119

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

次の例では、私は、一致しようとしているsseasonが、私はマッチを持っているものseaon

[s|season]

単語全体に一致する正規表現を作成するにはどうすればよいですか?


4
(season|s)代わりに使用してください。[season]のいずれかと一致しますseaon
falsetru 2013

回答:


137

角カッコは文字クラスのために意図されている、とあなたは、実際のいずれかに一致するようにしようとしている:s|s(再び)、 、eas再び)、oおよびn

グループ化の代わりに括弧を使用してください:

(s|season)

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

(?:s|season)

注:非キャプチャグループは、一致を保存する必要がないことをエンジンに通知しますが、他のグループ(キャプチャグループは保存します)を通知します。小さなものの場合は機能しますが、「ヘビーデューティー」の場合は、マッチが必要かどうかを最初に確認することをお勧めします。そうでない場合は、使用する必要のないものを保存するのではなく、非キャプチャグループを使用して計算用により多くのメモリを割り当てることをお勧めします。


ええ、私はそれを実現しました。非捕獲は私が必要としたものでした。()を使用すると常に一致すると思いましたが、一致しないオプションがあることを知っていると便利です。ありがとうございます。
NMGod 2013

あなたはそれを誤解しました。?:別名グループの内部non-capturingだけでは、あなたがに合わせた表現を使用することができないことを、言って$1$2そしてそうで...あなたは表現が一致していないことをしたい場合は、何が必要です^
EverythingRightPlace

@ NMGodA1b2c3d4どういたしまして!一致またはキャッチしないオプションを意味しますか(違いがあります、はい)。これらのいずれにも一致させたくない場合は、(?! ... )insead、つまり(?!s|season)この場合を使用します。
ジェリー

126

次のライブオンラインの例を使用して、パターンをテストします。

ここに画像の説明を入力してください

このライブの例から取られたスクリーンショットの上: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

変数gun1gun2文字列が含まれている、dartまたはfart正しい文字列が含まれていますが、gun3にはdartyまだ文字列が含まれていますが、それが問題です。次の例に移りましょう。

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

単語境界はと強制的に一致させることができます\b。以下を参照してください。 jex.im/regulexからwordboundaryが何をしているかの視覚的分析

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が」ではないと主張しています。


3
\ b文字が必要で、知らなかったので賛成です!
Nieminen

なぜこの完全な説明が答えではないのですか?
dewwwald

1
質問を投稿した人が最初の回答を選択し、後で私の非常に優れた回答が届いたときにわざわざ私のものに切り替えなかったからです。質問の下のコメントを介して質問者に質問の回答選択をこの質問に変更することができます。これにより、このページにアクセスした人にとってこのページの価値が向上します。
エリックレシンスキー

1
あなたの例で「おなら」という言葉を使ったので賛成しました...そして\ w +が必要でした;)
SomethingOn


4

私は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

2

[ ]文字クラスを定義します。そこで設定したすべてのキャラクターが一致します。orまたはor と[012]一致し、同じように動作します。012[0-2]

必要なのは、orステートメントを定義するためのグループ化です。(s|season)あなたの問題に使用します。

ところで あなたは注意する必要があります。通常の正規表現(またはグループ内)のメタ文字は、文字クラスとは異なります。文字クラスはサブ言語のようなものです。[$A]一致するのは$or のみでA、それ以外は何もありません。ドルのためにここから逃げることはできません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.