次の正規表現を機能させるのに問題があります。次の文字列が必要です。
"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