我有一个包含例如的字符串。 1a2b。数字为 1 至 9,字母 (a|b) 为常数。我想要一个查找“1a”和“2b”的正则表达式,其中任一组都是可选的。
我有这个...
String description = "bla bla bla: 1a2b more bla bla bla";
Pattern pattern = Pattern.compile("([1-9]a)([1-9]b)");
Matcher matcher = pattern.matcher(description);
if (matcher.find()) {
System.out.println(" group1: " + matcher.group(1));
System.out.println(" group2: " + matcher.group(2));
} else {
System.out.println("no match");
}
输出
group1: 1a
group2: 2b
如果我在任一组之后添加 ?
它仍然有效。如果我在 BOTH 之后添加 ?
它仍然匹配,但对两个组都返回 null。
如何使这两个组都是可选的,以便它匹配
情况 1:“bla 1a bla”
案例 2:“bla 2b bla”
情况 3:“bla 1a2b bla” ?
最佳答案
我发现有两种可能的方法:
一组进行两次:
如果您使用
"([1-9]a)([1-9]b)?|([1-9]b)"
,它将匹配您想要的内容,但是您必须检查第 2 组和第 3 组才能找到带有b
的部分。使用前瞻
在正则表达式
"(?=[1-9][ab])([1-9]a)?([1-9]b)?"
中,首先是正向前瞻将确保以下两个组之一匹配,然后这两个组就有匹配的机会。
解决方案 1 更便携(并非所有正则表达式引擎都支持前瞻),并且可能稍快一些(并且对于大多数人来说更容易理解),但需要更改组的使用方式(您必须检查组 2(或组 1)是否为 null
并在这种情况下使用组 3。
关于java - 正则表达式 - 可选择捕获 2 组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34028158/