繁体   English   中英

带有特殊字符和空格的正则表达式模式重复捕获组

[英]Regex Pattern repeat capturing group with special characters and spaces

我正在尝试为以下字符串捕获重复的组。

...和 ​​abc ( xyz(de),'f','g','h','i',xyz('p/q'),'r') = u...

我确实希望输出以以下格式分组为不同的匹配项

xyz(d.e)
'f'
'g'
'h'
'i'
xyz('p/q')
'r'

我能找到的最接近的解决方案是https://stackoverflow.com/a/65244969 所以我确实尝试过

abc\s*((?:([^,]+),?)

并得到输出

xyz(德)

但是,当我尝试

abc\s*((?:([^,]+),?)+

我明白了

'r') = 你...

有什么建议么?

在您的示例字符串中,您要么有一部分位于单引号之间,要么有一部分以单词字符开头,后跟括号。

当您尝试的模式以 abc 开头时,您可以使用:

(?:abc\s*\(\s*|\G(?!^),)('[^',]*'|\w+\([^()]*\))

解释

  • (?:非捕获组
    • abc\s*\(\s*匹配abc后跟(在可选空白字符之间的空格
    • | 或者
    • \G(?!^),在上一个匹配的末尾断言位置,而不是在字符串的开头以获得重复匹配。 接着匹配一个逗号。
  • )关闭非捕获组
  • (捕获组 1
    • '[^',]*''...'匹配,不匹配'或中间的逗号
    • | 或者
    • \w+\([^()]*\)匹配 1+ 个单词字符,后跟(...)
  • )关闭第 1 组

正则表达式演示| Java 演示

获取组 1 值的示例代码:

String regex = "(?:abc\\s*\\(\\s*|\\G(?!^),)('[^',]*'|\\w+\\([^()]*\\))";
String string = "and abc ( xyz(d.e),'f','g','h','i',abc('p/q'),'r') = u";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    if (null != matcher.group(1)) {
        System.out.println(matcher.group(1));
    }
}

输出

xyz(d.e)
'f'
'g'
'h'
'i'
abc('p/q')
'r'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM