我有一个包含例如的字符串。 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
如果我在EITHER组之后添加?
它仍然有效。如果我在BOTH之后添加?
它仍然匹配,但对两个组都返回null。
如何使两个组都可选,以便匹配
案例1:" bla 1a bla"
案例2:" bla 2b bla"
案例3:" bla 1a2b bla" ?
答案 0 :(得分:1)
我看到两种可能的方法:
有两个小组:
如果您使用"([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组。