Java正则表达式跳过匹配

Java正则表达式跳过匹配,java,regex,Java,Regex,我有一些文字;我想提取不被标点符号分隔的成对单词。代码如下: //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()); Arra

我有一些文字;我想提取不被标点符号分隔的成对单词。代码如下:

//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-grams
Pattern p=Pattern.compile(“[a-z]+”);
如果(n==2){
p=Pattern.compile(“[a-z]+[a-z]+”);
}
如果(n==3){
p=模式。编译(“[a-z]+[a-z]+[a-z]+”);
}
Matcher m=p.Matcher(text.toLowerCase());
ArrayList结果=新建ArrayList();
while(m.find()){
String temporary=m.group();
系统输出打印LN(临时);
结果.添加(临时);
}
问题是它跳过了一些匹配。比如说

“我叫詹姆斯”

,对于n=3,必须匹配

“我叫”和“我叫詹姆斯”


,但它只与第一个匹配。有办法解决这个问题吗

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


例如,正则表达式“121”与“312121121”的匹配度仅为“121_uuuu121”的两倍。

您可以使用“前瞻”中的组来捕获它

(?=(\b[a-z]+\b \b[a-z]+\b \b[a-z]+\b))
这导致它分为两组捕获..所以在您的情况下

Group1->
我的名字是


Group2->
name is james

我倾向于使用
Matcher的
find()
方法的参数:

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++;
}
因此,在每次迭代之后,它会根据最后一个开始索引再次搜索


希望有帮助!

有办法克服这个问题吗?没有。你可以通过使用
前瞻
这样的
(?=(121))
组中捕获它来匹配它。
我不知道有什么方法可以重用使用过的单元格。你可以尝试使用split()方法来实现。这与“name Is bond”、“ame Is bond”、“me Is bond”匹配…:)哦!对了!我在考虑另一种类型的正则表达式,比如在像
ababababa
这样的字符串中搜索像
ababababa
这样的字符串。按我的方式解决问题并查找所有出现的情况。很抱歉,误解!您的需要另一种方法。