2015-12-01 24 views
0

我有一个字符串包含例如。 1a2b。数字是1到9,字母(a | b)是常数。我想要一个正则表达式来查找'1a'和'2b',其中任何一个组都是可选的。正则表达式 - 可选地捕获2组

我有这个...

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: “喇嘛1A喇嘛”

案例2: “喇嘛2B喇嘛”

案例3:“喇嘛1a2b bla“ ?

+0

你试过吗?''' –

+1

只是一个简单的问题:为什么不使用'([1-9]?)([ab])'?你说(a)和(b)是恒定的,所以只有这个数字可以不存在 –

+0

一,其他或两者:'([1-9] a)|([1-9] b)|([1- 9] a)([1-9] b)' – Shloim

回答

1

我觉得那样做有两种可能的方式:

  1. 有一组两次:

    如果使用"([1-9]a)([1-9]b)?|([1-9]b)",它将匹配你想要什么,但你必须同时检查组2和3找到b的部分。

  2. 使用前瞻

    在正则表达式"(?=[1-9][ab])([1-9]a)?([1-9]b)?",第一个积极的预测先行将确保以下两个组之一匹配,那么这两个群体了解他们对匹配的机会。

解决方案1更加轻便(并非所有的正则表达式引擎支持先行),可能稍快(和更容易理解最),但需要在使用组的变化(你必须检查组2(或者组1)在null并且在那种情况下使用第3组。

+1

谢谢。1.为我工作,我会接受这个答案如果没有其他人可以在没有管道的情况下提供答案。 – TedTrippin

+0

@TedTrippin这是没有管道的,这是合乎逻辑的OR –

+1

在维基百科上搜索“竖线”。 – TedTrippin