【发布时间】:2015-06-04 06:56:19
【问题描述】:
我正在尝试在 Java 中捕获嵌套的可选组,但没有成功。
我试图捕获一个关键字后跟一个间隔,其中关键字是现在的任何东西,一个间隔只是两个日期。间隔可以是可选的,两个日期也可以是可选的。因此,以下是有效的匹配项。
- 字
- 字 [01/01/1900, ]i>
- 字 [, 01/01/2000]
- 字 [01/01/1900, 01/01/2000]
我想捕获关键字和两个日期,即使它们为空。
这是我想出的 Java MWE。
public class Parser {
public static void main(String[] args) {
Parser parser = new Parser();
String s = "word [01/01/1900, 01/01/2000]";
parser.parse(s);
}
public void parse(String s) {
String date = "\\d{2}/\\d{2}/\\d{4}";
String interval = "\\[("+date+")?, ("+date+")?\\]";
String keyword = "(.+)( "+interval+")?";
Pattern p = Pattern.compile(keyword);
Matcher m = p.matcher(s);
if (m.matches()) {
for (int i = 0; i <= m.groupCount(); ++i) {
System.out.println(i + ": " + m.group(i));
}
}
}
}
这是输出
0: word [01/01/1900, 01/01/2000]
1: word [01/01/1900, 01/01/2000]
2: null
3: null
4: null
如果间隔不是可选的,那么它可以工作。
String keyword = "(.+)( "+interval+")";
0: word [01/01/1900, 01/01/2000]
1: word
2: [01/01/1900, 01/01/2000]
3: 01/01/1900
4: 01/01/2000
如果间隔是一个不匹配的组(但仍然是可选的),那么它不起作用。
String keyword = "(.+)(?: "+interval+")?";
0: word [01/01/1900, 01/01/2000]
1: word [01/01/1900, 01/01/2000]
2: null
3: null
我需要做什么才能找回两个日期?谢谢。
编辑:第 2 部分。
假设现在我观察匹配重复的关键字。即正则表达式,keyword(, keyword)*。我试过了,但只捕获了第一个和最后一个实例。
为简单起见,假设我想将以下 a, b, c, d 与正则表达式 ([a-z])(?:, ([a-z]))* 匹配
但是,我只能取回第一组和最后一组。
0: a, b, c, d
1: a
2: d
为什么会这样?
刚刚发现这无法做到。 Capture group multiple times
【问题讨论】: