[英]regex - optionally capture 2 groups
我有一個包含例如的字符串。 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”?
我看到了兩種可能的方法:
分組兩次:
如果使用"([1-9]a)([1-9]b)?|([1-9]b)"
,它將與您想要的匹配,但是您必須同時檢查第2組和第3組找到與b
的部分。
提前使用
在正則表達式中, "(?=[1-9][ab])([1-9]a)?([1-9]b)?"
,首先,積極的前瞻將確保接下來的兩個組之一將匹配,然后兩個組將有機會進行匹配。
解決方案1更可移植(並非所有的正則表達式引擎都支持lookahead),並且可能稍微快一些(大多數情況下更容易理解),但是需要更改組的使用方式(您必須檢查組2(或組1)是否為null
並且在這種情況下,請使用第3組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.