当前位置: 首页 > 面试题库 >

Java正则表达式-捕获重复的组

单琛
2023-03-14
问题内容

我正在使用Java的正则表达式库。我想针对以下格式验证字符串:

31,5,46,7,86(...)

数字的数量未知。我想确保该字符串中至少有一个数字,并且每两个数字之间用逗号分隔。我也想从字符串中获取数字。

注意: 这只是一个简化的示例,string.split无法解决我的实际问题)

我写了以下正则表达式:

({[0-9]++)((?:,[0-9]++)*+)

验证部分起作用。但是,当我尝试提取数字时,我得到了2组:

Group1: 31
Group2: ,5,46,7,86

regex101版本:https://regex101.com/r/xJ5oQ6/3

有没有办法我可以分别获得每个数字?即以集合结束:

[31, 5, 46, 7, 86]

提前致谢。


问题答案:

Java不允许您访问重复捕获组的单个匹配项。

Tim Pietzcker提供的代码也可以为您提供帮助。如果您稍作修改,并为第一个数字添加特殊情况,则可以使用以下代码:

String target = "31,5,46,7,86";

Pattern compileFirst = Pattern.compile("(?<number>[0-9]+)(,([0-9])+)*");
Pattern compileFollowing = Pattern.compile(",(?<number>[0-9]+)");

Matcher matcherFirst = compileFirst.matcher(target);
Matcher matcherFollowing = compileFollowing.matcher(target);

System.out.println("matches: " + matcherFirst.matches());
System.out.println("first: " + matcherFirst.group("number"));

int start = 0;
while (matcherFollowing.find(start)) {
    String group = matcherFollowing.group("number");

    System.out.println("following: " + start + " - " + group);
    start = matcherFollowing.end();
}

输出:

matches: true
first: 31
following: 0 - 5
following: 4 - 46
following: 7 - 7
following: 9 - 86


 类似资料:
  • 你知道这里怎么了吗? 我想捕获“”之间的组。例如,如果字符串为 匹配器应捕获:

  • 问题内容: 我正在尝试使用Java expr在:之后捕获正确的部分,但是在以下代码中,打印的捕获组是整个字符串,怎么了? 问题答案: 子组的编号从1开始,全文为0。只需循环执行count + 1。

  • 我有一个字符串,可以通过以下方式格式化: 我试图(分别)捕获: 这是我的正则表达式:(也可能是,因为我不关心完整的捕获,只关心它的各个部分)。它捕获: 或(备用) 我不太明白如何让重复捕获组捕获所有单个实例,而不是整个事物,并且只是最后一个实例或只是最后一个实例。

  • 假设我有这个虚拟URL,我需要提取植物及其颜色作为 下面的I have正在按预期捕获我需要的元素,但是当我的URL中的植物少于4株时,它无法捕获任何东西。底部有一个指向regex测试员的链接,其中有示例代码和URL,您可以使用。 如何修改这个正则表达式,使其动态工作,从而在不需要静态URL结构的情况下捕获可用内容。现在,假设我最多只能捕获4株植物(8组) https://regex101.com/

  • 问题内容: 如何在Java Regex中定义重复组? 假设一个2位数[0-9] {2}多次用分隔, 这是可能的还是唯一的机会? 编辑:我想验证并提取。 问题答案: 最简单的方法是使用两步解决方案:1)首先,验证字符串,然后2)用您选择的定界符分割字符串: 在此,匹配以两位数字开头的整个字符串,然后匹配出现的0个或多个和结尾的两位数字,然后用逗号分割该字符串。注意你不需要和美女主播与图案内,因为该方

  • 问题内容: 我有以下一行, 我需要拿这个词ABC, 我写了以下代码片段, 所以,如果我说得到,ABC:但是如果我说是ABC,那么我想知道 这是什么和意味着什么呢?如果有人可以用很好的例子向我解释,那会更好。 正则表达式模式中包含一个:,为什么结果忽略了它?组1是否检测到括号内的所有单词? 因此,如果我再加上两个括号,例如:,那么会有两个小组吗?group(1)将退还零件并退还零件? 给出该代码段的