Java中的正则表达式 - 仅返回最后一个匹配项

时间:2017-06-02 09:00:20

标签: java regex string

下面的代码片段应该返回并存储ArrayList中的匹配项,但出于某种原因,我只得到最后一个匹配项,即23;我当然希望25623。你能告诉我我做错了什么吗?提前谢谢。

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

3 个答案:

答案 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