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
这样的字符串。按我的方式解决问题并查找所有出现的情况。很抱歉,误解!您的需要另一种方法。