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))

这会导致它分为两组捕获..所以在你的情况下它会是

组1->my name is

组2->name is james

于 2012-11-11T10:55:24.857 回答
1

在正则表达式中,由正则表达式定义的模式从左到右应用于字符串,一旦在匹配中使用源字符,它就不能被重用。

例如,正则表达式“121”将仅匹配“31212142121”两次作为“<em>121___121”。

于 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 回答