1

テキストの例:公園では、子供が遊んでいます。子供は背が高い。子供は遊んでいる別の子供を見ています。

最初の文の「子」、2番目と3番目の文の「子」は一致させたいが、3番目の文の「子」は一致させたくない。つまり、「Child」または「child」と一致しますが、「another」という単語が続く場合は一致しません。

ネガティブルックビハインドを使ってできると思った

 ((?<\!another) [Cc]hild)

しかし、有効な正規表現を生成するための構文を正しく取得できないようです。

構文を正しく理解できたとしても、GWTでそれを実行できるかどうかはわかりません。これはGWTJavadocからのスニペットです

正規表現構文のJava固有の構造(たとえば[a-z&&[^bc]], (?<=foo), \A, \Q)、GWT実装ではなく、純粋なJava実装でのみ機能します...

任意の助けや洞察をいただければ幸いです。

アップデート:

コリンの答えはほとんど機能しますが、完全には正しくありません。

コリンの正規表現は「子」と「子」に一致し、私が尋ねたように「別の子」には一致しません。ただし、いくつかの問題があります。

私がやろうとしているのは、「子供」と「子供」を一致させて、子供の性別に応じて、子供の名前または正しい代名詞のいずれかに置き換えることができるようにすることです。

コリンの正規表現の問題は、「、child」と「.Child」に一致することです。また、それがテキストの最初の単語である場合、「子」とは一致しません。例えば:

「子供は公園に行きました。公園では子供が遊んでいます。子供は背が高いです。子供は遊んでいる別の子供を見ています。」

最初の子は一致しません。後続の一致は、「、child」、「。Child」、および「.Child」です。

コリンが「子供」または「子供」とちょうど一致するようにしようと思いついた正規表現に取り組みましたが、それを機能させることはできません。

4

2 に答える 2

1

GWT の正規表現は、ネイティブ JavaScript クラスを呼び出すだけなので、RegExp JavaScript と同じレベルのサポートがあります。

JavaScript 正規表現が後読みまたは所有量指定子をサポートしていないことを考えると、正規表現で「別の子」を直接拒否する方法は考えられません。

したがって、「別の」が「子」の前に表示された場合、「別の」が確実に一致するように正規表現を記述します。それ以外の場合は、「子」のみが一致します。その後、5 文字を超える一致を除外できます。

RegExp.compile("(?:another +)?[Cc]hild", "g")

文字列「some children」の「child」も一致することに注意してください。また、「another」が長い単語列の中に埋め込まれている場合 (たとえば、「ranother」1 )、やみくもにそのフラグメントを選択します。\bこのようなケースを防ぐには、単語境界チェック2を追加する必要があります。

RegExp.compile("(?:\\banother +)?\\b[Cc]hild\\b", "g")
                   ---           ---        ---
                    |             |          |
            prevent "ranother"  prevent "children"
              from matching        or "nochild"
                                  from matching

大文字と小文字を区別しない一致 (テキストの場合は非常に合理的) をiflag で許可することもできます。ただし、ご判断はお任せします。

上記の正規表現を使用すると、「子」に一致する前に常に「別の子」に一致します。したがって、一致に「子」のみが含まれている場合、「別の」がその前にないことがわかります。したがって、長さが 5 を超える一致を除外することができ、有効な文字列のみが残ります。

脚注

  1. 例として造語を使用します。任意の文字列では完全に正常ですが、英語に「別の」が埋め込まれた単語があるかどうかはわかりません。

  2. ここで注意事項があります。「child4」または「child_something」は、使用時に一致しません\b。一方、「_another child」または「5another child」の「another」は正規表現によって取得されません (「child」のみが一致するため、一致を受け入れることを意味します)。回避策は可能ですので、ご要望があれば対応させていただきます。

于 2013-02-16T03:00:30.037 に答える
-1

「Child」または「child」に一致しますが、「another」という単語が続く場合は一致しません

([^(?:another)] [Cc]hild)

anotherこれは、(非キャプチャ グループの否定された文字セットを使用して)で始まらないグループをキャプチャし、次にスペース、次にchild大文字かどうかの単語をキャプチャします。スペースは必須ですか?あなたはオリジナルでそれを持っていました、そしてそれはあなたの例の4つのテストケースすべてに存在しています. これをもう少し便利にして (実際にキャプチャしようとしているのは何ですか?)、child の周囲で唯一のキャプチャ グループを開始します。

[^(?:another)] ([Cc]hild)

サポートされているブラウザの正規表現機能に関する MDN ドキュメントの使用: https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Regular_Expressions

テストケース:

public void testHomeworkRegex() {
  String sample = "In the park, child plays. Child is tall. Child watches another child at play.";
  RegExp regex = RegExp.compile("[^(?:another)] ([Cc]hild)", "g");//using global flag to match multiple times

  MatchResult result1 = regex.exec(sample);
  assertNotNull(result1);
  assertEquals("child", result1.getGroup(1));

  MatchResult result2 = regex.exec(sample);
  assertNotNull(result2);
  assertEquals("Child", result2.getGroup(1));

  MatchResult result3 = regex.exec(sample);
  assertNotNull(result3);
  assertEquals("Child", result3.getGroup(1));


  MatchResult result4 = regex.exec(sample);
  assertNull(result4);
}
于 2013-02-15T23:53:46.757 に答える