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

Java正则表达式:重复组?

叶坚
2023-03-14
问题内容

如何在Java Regex中定义重复组?

假设一个2位数[0-9] {2}多次用分隔,

12,34,98,11

这是可能的还是唯一的机会?

编辑:我想验证并提取。


问题答案:

最简单的方法是使用两步解决方案:1)首先,验证字符串,然后2)用您选择的定界符分割字符串:

String[] chunks = null;
if (s.matches("\\d{2}(?:,\\d{2})*")) {
    chunks = s.split(Pattern.quote(","));
    System.out.println(Arrays.toString(chunks)); // => [12, 34, 98, 11]
}

在此,s.matches("\\d{2}(?:,\\d{2})*")匹配以两位数字开头的整个字符串,然后匹配出现的0个或多个,和结尾的两位数字,然后s.split(Pattern.quote(","))用逗号分割该字符串。注意你不需要^$美女主播与图案内matches(),因为该方法需要一个完整的字符串匹配。

如果必须使用单个regex来执行此操作,则
只有在字符串开头的字符串检查成功的情况下,才可以在字符串的开头和每个成功的先前匹配的结尾处使用多个匹配项:

(?:\G(?!^),|^(?=\d{2}(?:,\d{2})*$))(\d{2})

请参阅regex演示。

细节

  • (?:\G(?!^),|^(?=\d{2}(?:,\d{2})*$))-前面成功匹配的结尾,然后是字符串()的,(参见\G(?!^),)或(|)开头,^后跟两位数,然后是0或更多序列的a ,和两位数到字符串的末尾(参见\d{2}(?:,\d{2})*$
  • (\d{2}) -第1组:两位数

Java演示:

String s = "12,34,98,11";
Pattern p = Pattern.compile("(?:\\G(?!^),|^(?=\\d{2}(?:,\\d{2})*$))(\\d{2})");
Matcher m = p.matcher(s);
List<String> results = new ArrayList<>();
while(m.find()) {
    results.add(m.group(1));
}
System.out.println(results); 
// => [12, 34, 98, 11]


 类似资料:
  • 如何在不包含连续子字符串baa的字母表{a,b,c}上表达正则表达式?

  • 问题内容: 我正在使用Java的正则表达式库。我想针对以下格式验证字符串: 数字的数量未知。我想确保该字符串中至少有一个数字,并且每两个数字之间用逗号分隔。我也想从字符串中获取数字。 ( 注意: 这只是一个简化的示例,string.split无法解决我的实际问题) 我写了以下正则表达式: 验证部分起作用。但是,当我尝试提取数字时,我得到了2组: regex101版本:https://regex10

  • 我的正则表达式是 当我在java中使用Pattern.complie()编译时,我得到了*非法重复字符* 我测试了这个正则表达式 当我编译这个时,它没有显示错误。 为什么会发生这种情况?

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