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

olmpazwi  于 2021-06-29  发布在  Java
关注(0)|答案(3)|浏览(311)

我一直在尝试使用regex在字符串中查找某些整数(我不完全确定它是什么,有人能给我介绍一些东西来了解它吗?),但是有一些问题。我在字符串中查找第一个整数并将该整数值设置为变量,但在查找第二个整数时遇到了问题。这是我目前的代码:

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鳄梨酱36”,我希望它设置 min 变量的值为1 max 一个36的变量。我该怎么做?所有出现的都是错误,我从第二个匹配器的部分中假设。
请让我知道,如果你可以帮助查询或如果我应该添加更多的信息-提前感谢!
附笔 list 是一个字符串数组,对于每个字符串,每次都要将min和max重置为字符串中的整数。

9rygscc1

9rygscc11#

打电话 group() 查找组0(即整个匹配项),但您想要的数字在组1中捕获,因此您应该执行以下操作:

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!
}
6tqwzwtp

6tqwzwtp2#

如果您想使用一行正则表达式方法,那么使用 String#replaceAll 使用此正则表达式模式:

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

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

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

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

83qze16e

83qze16e3#

我认为你需要继续寻找下一个项目,只要字符串包含它,你想处理。如其他答案所示,如果您明确地寻找第二个数字,那么您可以使用 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

相关问题