我有一些文字;我想提取没有标点符号分隔的单词对。这是代码:
//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,必须匹配
“我的名字是”和“名字是詹姆斯”
,但它只匹配第一个。有办法解决这个问题吗?
答案 0 :(得分:4)
您可以使用前瞻中的组来捕获它
(?=(\b[a-z]+\b \b[a-z]+\b \b[a-z]+\b))
这导致它捕获两组。所以在你的情况下它将是
Group1-&GT; my name is
Group2-&GT; name is james
答案 1 :(得分:1)
正则表达式由正则表达式定义的模式从左到右应用于字符串,一旦在匹配中使用源字符,就无法重复使用。
例如,正则表达式“121”仅匹配“31212142121”两次“ 121 ___ 121”。
答案 2 :(得分: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++;
}
因此,在每次迭代后,它会根据最后一个起始索引再次搜索。
希望有所帮助!