试图在字符串中找到第二个整数 - 不工作

Trying to find second integer in string - Not working

我一直在尝试使用正则表达式在字符串中查找某些整数(我不完全确定它是什么,有人可以推荐我一些东西来了解它吗?),但遇到了一些问题。我已经开始寻找字符串中的第一个整数并将该整数值设置为变量,但在寻找第二个时卡住了。这是我目前的代码:

for (int x = 0; x < list.length; x++) {
                    
    current = list[x];
                                                
    Matcher first = Pattern.compile("\d+").matcher(current);
    first.find();
    min = Integer.valueOf(first.group());
                    
    Matcher second = Pattern.compile("^\D*\d+\D+(\d+)").matcher(current);
    second.find();
    max = Integer.valueOf(second.group());
                    
    System.out.println("min: " + min + " max: " + max);
                    
                    
}

在这种情况下,假设字符串是“1 guacamole 36”,我希望它将 min 变量设置为值 1,将 max 变量设置为 36 . 我会怎么做呢?所有出现的都是错误,我假设来自第二个匹配器的部分。

请告诉我您是否可以帮忙查询或我是否应该添加更多信息 - 提前致谢!

P.S。 list 是一个字符串数组,我试图让每个字符串的最小值和最大值每次都重置为字符串中的整数。

调用group()找到组0(即整场比赛),但你要的号码在组1[=24=中被捕获], 所以你应该这样做:

max = Integer.valueOf(second.group(1));

您实际上不需要第二个正则表达式来查找第二个数字。只需让第一个匹配器再次匹配 。它将找到第二个数字:

Matcher first = Pattern.compile("\d+").matcher(current);
first.find();
min = Integer.valueOf(first.group());

first.find(); // call find again!
max = Integer.valueOf(first.group());

一个更安全的方法是在调用 group:

之前检查匹配器是否真的找到了任何东西
Matcher first = Pattern.compile("\d+").matcher(current);
if (first.find()) {
    min = Integer.valueOf(first.group());


    if (first.find()) { // call find again!
        max = Integer.valueOf(first.group());
    } else {
        // can't find a second number!
    }
} else {
    // can't find any numbers!
}

如果您想使用单行正则表达式方法,请将 String#replaceAll 与此正则表达式模式一起使用:

\D*\d+\D+(\d+).*

这将在第一个捕获组中捕获输入中的第二个数字。示例脚本:

String input = "1 guacamole 36";
String secondNum = input.replaceAll("\D*\d+\D+(\d+).*", "");
System.out.println(secondNum);  // prints 36

注意:如果输入 而不是 中至少有两个单独的数字,那么上述替换实际上只是 return 输入。在这种情况下,如果您想报告不匹配,您应该首先使用 String#matches.

检查匹配模式

我认为您需要继续查找下一个项目,只要字符串包含它并且您想要处理它。如其他答案所述,如果您明确寻找第二个数字,则可以使用 regex 或使用 second.group(1).

如果您要查找字符串中给出的最小值和最大值,我是这样做的:

String text = "1 guacamole 36 admin test 23 which is equivalent 22";
Pattern pattern = Pattern.compile("\d+");
Matcher matcher = pattern.matcher(text);
List<Integer> numbers = new ArrayList<>();
while (matcher.find()) {
    numbers.add(Integer.parseInt(matcher.group()));
}
System.out.println(numbers);
Collections.sort(numbers);
int min = -1;
int max = -1;
if (!numbers.isEmpty()) {
    int size = numbers.size();
    min = numbers.get(0);
    max = numbers.get(size - 1);
}
System.out.println("Min : " + min);
System.out.println("Max : " + max);

这应该打印

[1, 36, 23, 22]
Min : 1
Max : 36