2

テキストがあります。句読点で区切られていない単語のペアを抽出したい。これはコードです:

//n-grams
Pattern p = Pattern.compile("[a-z]+");
if (n == 2) {
    p = Pattern.compile("[a-z]+ [a-z]+");
}
if (n == 3) {
    p = Pattern.compile("[a-z]+ [a-z]+ [a-z]+");
}
Matcher m = p.matcher(text.toLowerCase());
ArrayList<String> result = new ArrayList<String>();

while (m.find()) {
    String temporary = m.group();
    System.out.println(temporary);

    result.add(temporary);
}

問題は、いくつかの一致をスキップすることです。例えば

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

、n = 3 の場合、一致する必要があります

「私の名前は」と「名前はジェームズ」

、代わりに最初のものだけに一致します。これを解決する方法はありますか?

4

3 に答える 3

4

先読みでグループを使用してキャプチャできます

(?=(\b[a-z]+\b \b[a-z]+\b \b[a-z]+\b))

これにより、2つのグループでキャプチャされます..したがって、あなたの場合は

グループ1->my name is

グループ 2->name is james

于 2012-11-11T10:55:24.857 に答える
1

regex で定義された正規表現パターンは文字列に左から右に適用され、ソース文字が一致で使用されると再利用できません。

たとえば、正規表現「121」は「31212142121」と「<em>121___121」の 2 回だけ一致します。

于 2012-11-11T10:49:35.643 に答える
1

find()私は次のメソッドへの引数を使用する傾向がありますMatcher

Matcher m = p.matcher(text);
int position = 0;
while (m.find(position)) { 
  String temporary = m.group();
  position = m.start();  
  System.out.println(position + ":" + temporary);
  position++;
}

したがって、各反復の後、最後の開始インデックスに基づいて再度検索します。

それが役に立ったことを願っています!

于 2012-11-11T10:59:04.690 に答える