4

次の正規表現を機能させるのに問題があります。次の文字列が必要です。

"Please enter your name here"

次の要素を持つ配列になります。

'please enter', 'enter your', 'your name', 'name here'

現在、私は次のパターンを使用しており、マッチャーを作成して次のように繰り返しています。

Pattern word = Pattern.compile("[\w]+ [\w]+");
Matcher m = word.matcher("Please enter your name here");

while (m.find()) {
    wordList.add(m.group());
}

しかし、私が得ている結果は次のとおりです。

'please enter', 'your name'

私は何を間違っていますか?(追伸、regexpal.comで同じ正規表現をチェックしたところ、同じ問題がありました)。同じ単語が 2 回一致することはないようです。望む結果を得るにはどうすればよいですか?

ありがとう。

----------------------------------

編集: すべての提案をありがとう!私はこれを行うことになりました(「n-gram」の数を簡単に指定できる柔軟性が追加されるため):

Integer nGrams = 2;
String patternTpl = "\\b[\\w']+\\b";
String concatString = "what is your age? please enter your name."
for (int i = 0; i < nGrams; i++) {
    // Create pattern.
    String pattern = patternTpl;
    for (int j = 0; j < i; j++) {
        pattern = pattern + " " + patternTpl;
    }
    pattern = "(?=(" + pattern + "))";
    Pattern word = Pattern.compile(pattern);
    Matcher m = word.matcher(concatString);

    // Iterate over all words and populate wordList
    while (m.find()) {
        wordList.add(m.group(1));
    }
}

これにより、次の結果が得られます。

Pattern: 
(?=(\b[\w']+\b)) // In the first iteration
(?=(\b[\w']+\b \b[\w']+\b)) // In the second iteration

Array:
[what, is, your, age, please, enter, your, name, what is, is your, your age, please enter, enter your, your name]

注: 次の上位の回答からパターンを取得しました: Java regex skipping matches

4

4 に答える 4