regex Java正则表达式匹配器在与单个数字组进行OR运算时不返回2个连续数字的组

ajsxfq5m  于 2023-03-09  发布在  Java
关注(0)|答案(2)|浏览(113)

我正在尝试创建一个正则表达式,它从字符串中提取所有连续的数字(包括单个数字)
下面的正则表达式无法提取2个连续数字。

public static void main(String args[]) {
    print(checkRegex("2G18R"));
}
private static void print(String arr []) {
    for(String s : arr) {
        System.out.println(s);
    }
    System.out.println("-----------------------------");
}
private static String [] checkRegex(String str) {
    System.out.println("original string " + str);
    Pattern pattern = Pattern.compile(".*(\\d{4})|(\\d{3})|(\\d{2})|(\\d+).*");
    Matcher matcher = pattern.matcher(str);
    if(matcher.find()) {
        return new String [] {
            matcher.group(1),
            matcher.group(2),
            matcher.group(3),
            matcher.group(4)
        };
     }
     return new String [] {};
}

预期的输出是matcher.group(3)应该返回18,但它返回空值。
总体预期输出为[2,18]

hk8txs48

hk8txs481#

模式".*(\\d{4})|(\\d{3})|(\\d{2})|(\\d+).*"将匹配类似"abc1234|567|89|0efg"的内容
我想你需要这样的模式:"(\\d{1,4})"

public static void main(String[] args) {
    checkRegex("2G18R");
    checkRegex("2G18R15559X9871C1");
}

private static void checkRegex(String str) {
    System.out.println("original string " + str);
    Pattern pattern = Pattern.compile("(\\d+)");
    Matcher matcher = pattern.matcher(str);
    List<String> result = new ArrayList<>();
    while (matcher.find()) {
        result.add(matcher.group(1));
    }
    System.out.println("Result: " + result);
}

和输出:

original string 2G18R
Result: [2, 18]
original string 2G18R15559X9871C1
Result: [2, 18, 15559, 9871, 1]
g52tjvyc

g52tjvyc2#

不清楚你是只需要数字数组还是要使用正则表达式。这里有一个匹配的替代方法。只要使用split。

String[] array = {
        "2G18R","2sls2l2222l1l1","ksksks2232ksksk2k2k22k222k2k9282"
};
  • 这里,split将按任意长度的非数字\\D+拆分字符串
  • 如果所有字符串都以数字开头,那么就不需要条件复制,因为条件复制只是复制数组,如果字符串不是以数字开头,则跳过第一个单元格。
for (String str : array) {
    String[] numbers = str.split("\\D+");
    if (numbers.length > 0 && numbers[0].isBlank()) {
        numbers = Arrays.copyOfRange(numbers, 1, numbers.length);
    }
    System.out.println(Arrays.toString(numbers));
}

您也可以采用流方法过滤掉有问题的字符串。

for (String str : array) {
    String[] numbers = Arrays.stream(str.split("\\D+"))
            .filter(s -> !s.isBlank()).toArray(String[]::new);
    System.out.println(Arrays.toString(numbers));
}

都打印以下内容

[2, 18]
[2, 2, 2222, 1, 1]
[2232, 2, 2, 22, 222, 2, 9282]

相关问题