下面的代码片段应该返回并存储ArrayList中的匹配项,但出于某种原因,我只得到最后一个匹配项,即23
;我当然希望256
和23
。你能告诉我我做错了什么吗?提前谢谢。
public static void main(String[] args){
String target = "nawaK256he23llo";
String regexNb = "[0-9]+";
Pattern patternNb = Pattern.compile(regexNb);
Matcher mNb = patternNb.matcher(target);
List<String> allMatchesNb = new ArrayList<String>();
while (mNb.find()) {
System.out.println("mNb matched : " + mNb.find());
allMatchesNb.add(mNb.group());
for (String nb : allMatchesNb) {
System.out.println("content of ArrayList :" + nb);
}
}
}
输出如下:
content of ArrayList : 23
答案 0 :(得分:3)
您正在拨打find()两次,而这正在消耗第一场比赛
System.out.println("mNb matched : " + mNb.find());
改为:
String target = "nawaK256he23llo";
String regexNb = "[0-9]+";
Pattern patternNb = Pattern.compile(regexNb);
Matcher mNb = patternNb.matcher(target);
List<String> allMatchesNb = new ArrayList<>();
while (mNb.find()) {
allMatchesNb.add(mNb.group());
}
System.out.println(allMatchesNb);
答案 1 :(得分:3)
要避免此问题,并且不要更改代码的逻辑,您可以使用:
boolean find = false;//create a variable so you can use in the loo^p
while (find = mNb.find()) {
// ^-------------------Initialize the variable
System.out.println("mNb matched : " + find);
//------------------------------------------^^
注意强>
find = mNb.find()
中的一个等于= 而不是两个,这不是一个 条件它是一个初始化,所以你可以使用它System.out.println("mNb matched : " + find);
答案 2 :(得分:1)
来自Matcher.find()
的javadoc(由我强调):
尝试找到输入序列的 next 子序列 匹配模式。
此方法从此匹配器区域的开头开始,或者, 如果先前的方法调用成功并且匹配器尚未重置,则第一个字符不匹配 上一场比赛。
你在每次迭代中调用mNb.find()
两次,第一次发现“256”,第二次发现“23”。最简单的解决方案是摆脱一次调用:
public static void main(String[] args) {
String target = "nawaK256he23llo";
String regexNb = "[0-9]+";
Pattern patternNb = Pattern.compile(regexNb);
Matcher mNb = patternNb.matcher(target);
List<String> allMatchesNb = new ArrayList<String>();
while (mNb.find()) {
System.out.println("mNb matched : " + true);
allMatchesNb.add(mNb.group());
for (String nb : allMatchesNb) {
System.out.println("content of ArrayList :" + nb);
}
}
}
输出:
mNb matched : true
content of ArrayList :256
mNb matched : true
content of ArrayList :256
content of ArrayList :23