具有可变组数的正则表达式?

2022-09-01 06:10:45

是否可以创建具有可变组数的正则表达式?

例如,运行此命令后...

Pattern p = Pattern.compile("ab([cd])*ef");
Matcher m = p.matcher("abcddcef");
m.matches();

...我想有这样的东西

  • m.group(1) = "c"
  • m.group(2) = "d"
  • m.group(3) = "d"
  • m.group(4) = "c".

(背景:我正在解析一些数据行,其中一个“字段”正在重复。我想避免这些字段的循环。matcher.find


正如@Tim Pietzcker在评论中指出的那样,perl6.NET具有此功能。


答案 1

根据文档,Java正则表达式不能这样做:

与组关联的捕获输入始终是该组最近匹配的子序列。如果由于量化而对组进行了第二次评估,则如果第二次评估失败,则将保留其先前捕获的值(如果有)。将字符串“aba”与表达式(a(b)?例如,+将组 2 设置为“b”。所有捕获的输入将在每次匹配开始时被丢弃。

(着重号后加)


答案 2

您可以使用 split 将所需的字段放入数组中并循环访问。

http://download.oracle.com/javase/1,5.0/docs/api/java/lang/String.html#split(java.lang.String))