4

同じ行で繰り返される単語を見つけるための正規表現は何ですか?

thisなど、Stack Overflow で見つけたいくつかの式を試しましたが、正しく機能するものはありません。

私が達成したい結果:

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

4

4 に答える 4

20

この正規表現は、強調表示する単語を見つけるために行います。(この例は JavaScript であり、ブラウザーの JavaScript コンソールで簡単にテストできます。)

s = "It's a foo and a bar and a bar and a foo too.";
a = s.match(/\b(\w+)\b(?=.*\b\1\b)/g);

これは単語の配列を返します。同じ単語に対して複数回返される可能性があります。

次にこれを行うことができます:

re = new RegExp('\\b(' + a.join('|') + ')\\b', 'g');

そして、それはすべての出現を強調表示するのに十分なはずです:

out = s.replace(re, function(m) { return '<b>' + m + '</b>' });
于 2013-05-06T19:58:29.117 に答える
1

たとえば、連続する複数の単語を検索する場合は、次のようにします。

サムwent went to to toのビジネス

この正規表現を使用できます:

s = "Sam went went to to to his business";
a = s.match(/\b(\w+)(\s\1)+\b/g);
于 2020-04-12T12:36:20.350 に答える
0

サンプル文字列がない場合は、テスト ケースと、これを実現する方法のいくつかの例を使用してみましょう。

私の名前はジェームズで、ジェームズは私の名前です

正規表現

^(ジェームズ)$

グループ 1 (通常、0 は完全な一致文字列であり、キャプチャ カウントがない可能性があります) は 2 回キャプチャされます。これは、単語が繰り返されることを意味します。「単語」に興味があるかどうかを判断するために、正規表現を実行するために使用しているツールにはいくつかのロジックが必要です。

同じ文字列を使用して、この正規表現を検討してください

(?<=James.*)(James)

これは、'James' の後に任意の文字が続く場合に限り、James という単語を検出します。エンジンによっては、「.」(ピリオド) は、デフォルトで改行以外の任意の文字と一致する必要があります。これにより、検索が 1 行に制限されます。

単語を正確に指定しなければならないという制限に注意してください。これを回避する方法がわかりません。

編集これを試してください、それはすごいです..

(?<=^|\s+\1\s+.*)\s+(\w+)

(例 2 のように) 肯定的な後読みを使用して、現在のグループに一致する「単語全体」を検出します。単語全体は次のように定義されます。

  • 私たちの現在の言葉
  • 少なくとも 1 つの空白文字が続くか、行の先頭にある
  • 少なくとも 1 つのスペースが続く

さらに、一致する単語は独立した単語でなければなりません (少なくとも 1 つのスペース文字が先行します)。

結果に関する限り、各試合は単語の繰り返しになります。

于 2013-05-02T08:49:54.720 に答える