4

私は正規表現に不慣れで、いくつかの基本的なものに苦労しています。

var name = "robert johnson";
var searchTerm = "robert johnson";

if (searchTerm.match(name)) {
    console.log("MATCH");
}

次のいずれかに一致するものを見つけてみたいと思います。

rob, robert, john, johnson, robertjohnson

正規表現を簡単にするために、「name」変数と「searchTerm」変数の両方に.toLowerCase()をすでに追加しました。

これを機能させるには、searchTerm.match(name)にどの正規表現を追加する必要がありますか?

明確化:私は、私が与えた5つの例でテストに合格しようとしているだけでなく、それらのテストのいずれかが合格する正規表現を考え出そうとしています。したがって、たとえば:

searchTerm.match(name)

...次のようなものに変更する必要があります:

searchTerm.match("someRegexVoodooHere"+name+"someMoreRegexVoodooHere")

だから、私が編集すると

var searchTerm = "robert johnson";

...することが

var searchTerm = "rob";

...同じ関数searchTerm.matchディレクティブが機能します。

繰り返しになりますが、私は正規表現を初めて使用するので、これを明確に求めていることを願っています。基本的に、searchTermを受け取る関数を作成する必要があります(ここには含まれていませんが、他の場所では少なくとも3文字を入力する必要があります)。指定された文字列でこれらの3文字が順番に見つかるかどうかを確認できます。 「名姓」の。

4

4 に答える 4

5
"robert johnson".match(/\b(john(son)?|rob(ert(johnson)?)?)\b/)

可能なすべての一致が得られます(入力文字列に単語が含まれているかどうかを確認する必要がある場合は、1つ以上あります。

/\b(john(son)?|rob(ert(johnson)?)?)\b/.test("robert johnson")

true文字列に一致するものがある場合に戻ります。(すべての一致を見つける必要がないため、条件内でこれを使用することをお勧めします)。

  • \b-単語の境界を意味します。
  • ()-キャプチャグループ。
  • ?-数量詞「1つまたはなし」。
  • |-論理「または」。
于 2012-10-20T22:43:18.620 に答える
2

正規表現は、一致するパターンを探します。あなたの質問への答えは、あなたが達成したいことによって多少異なります-つまり、実際に一致するグループが必要ですか、それとも他のコードを実行するためのパターンの存在をテストするだけですか?

文字列の値を一致させるには、ブール値を使用するか、|-と一致させる必要があります。iフラグを使用すると、大文字と小文字が区別されない一致が発生するため、toLowerCase()-を呼び出す必要はありません。

var regex = /(rob|robert|john|johnson|robertjohnson)/i;
regex.match(name);

より複雑な正規表現をこれらすべてのバリエーションに一致させたい場合-

var names = "rob, robert, john, johnson, robertjohnson, paul";
var regex = /\b((rob(ert)?)?\s?(john(son)?)?)\b/i;
var matches = regex.match(names);

これにより、matches配列に5つの要素(「paul」を除く各名前)が含まれるようになります。これは、「robjohnson」や「robjohn」など、望ましくない可能性のある追加の名前にも一致することに注意してください。

test()-を使用して、文字列にこれらの用語のいずれかが含まれているかどうかをテストすることもできます。

var name = "rob johnson";
var regex = /\b((rob(ert)?)?\s?(john(son)?)?)\b/i;
if (regex.test(name)){
   alert('matches!');
}
于 2012-10-20T22:42:07.283 に答える
2

テスト用語の配列を作成し、その配列をループすることができます。この方法は、動的な環境で構築するためのより簡単な正規表現を意味します

var name = "robert johnson";
var searchTerm = "robert johnson";

var tests = ['rob', 'robert', 'john', 'johnson', 'robertjohnson'];
var isMatch = false;

for (i = 0; i < tests.length; i++) {
    if (searchTerm.test(tests[i])) {
        isMatch = true;
    }
}

alert(isMatch)
于 2012-10-20T22:43:23.983 に答える
1

/^\s*(rob(ert)?|john(son)?|robert *johnson)\s*$/i.test(str)

str次のいずれかに一致する場合はtrueを返します。

  • ロブ
  • ロバート
  • ジョン
  • ジョンソン
  • ロバート・ジョンソン
  • ロバート・ジョンソン
  • robert johnson(これら2つの間のスペースは関係ありません)

また、前後に空の文字があるかどうかは関係ありません。それが不要な場合\s*は、パターンの最初と最後から削除してください。また、名前と名前の間のスペースとアスタリスクは、これら2つの間に0個以上のスペースを許可します。スペースを含めたくない場合は、そのスペースとアスタリスクを削除してください。

カレット^は文字列の始まりを示し、ドル記号$は文字列の終わりを示します。最後に、最後のiフラグにより​​、大文字と小文字が区別されなくなります。

于 2012-10-20T22:48:48.887 に答える