1

なぜこのコード:

String keyword = "pattern";
String text    = "sometextpatternsometext";
String patternStr = "^.*" + keyword + ".*$"; //
Pattern pattern = Pattern.compile(patternStr, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
    int start = matcher.start();
    int end = matcher.end();
    System.out.println("start = " + start + ", end = " + end);
}

開始=0、終了= 23

正しく動作しません。

しかし、このコード:

String keyword = "pattern";
String text    = "sometext pattern sometext";
String patternStr = "\\b" + keyword + "\\b"; //
Pattern pattern = Pattern.compile(patternStr, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
    int start = matcher.start();
    int end = matcher.end();
    System.out.println("start = " + start + ", end = " + end);
}

開始=9、終了= 16

うまくいきます。

4

3 に答える 3

8

それ機能します。あなたのパターン

^.*pattern.*$

一致すると言う:

  1. 最初から始める
  2. 任意の数の文字を受け入れる
  3. 文字列が続くpattern
  4. 任意の数の文字が続きます
  5. 文字列の終わりまで

結果は入力文字列全体です。単語のみを検索したい場合pattern、正規表現はそれ自体の単語、または検索したように単語境界のメタ文字で囲まれた単語になります。

于 2012-06-06T18:33:07.693 に答える
4

最初の例が機能しなかったわけではありません。意図した以上に一致するように誤って要求したためです。

式は.*、「パターン」の前のすべての文字とパターンの後のすべての文字を含むように拡張されるため、式全体が行全体と一致します。

2番目の例では、「pattern」の前後の空白スペースに一致するように指定するだけなので、式はほとんどの場合patternに加えて、いくつかのスペースに一致します。

于 2012-06-06T18:34:03.313 に答える
1

問題は正規表現にあります:"^.*" + keyword + ".*$"

.*は、文字列に含まれる文字数と同じ数の文字に一致します。これは、実際には文字列全体と一致することを意味します。文字列全体の後で、キーワードが見つかりません。

それを機能させるには、貪欲にする必要があります。つまり、後に疑問符を追加します.*

"^.*?" + keyword + ".*$"

今回.*?は、最小文字とそれに続くキーワードに一致します。

于 2012-06-06T18:36:13.993 に答える