测试是否存在命名的捕获组

时间:2013-03-08 09:04:19

标签: java regex

我有一大堆代码根据用户提供的正则表达式从字符串中提取日期。有几种不同的配置系统的方法,但通常对用户来说最方便的是只指定一个命名的捕获组,然后代码从中提取日期。例如:

Input: ABC-20130308
Regex: ABC-(?<date>\d{8})

代码非常简单:

Pattern p = Pattern.compile( regex );
Matcher m = p.matcher( input );
m.find();
m.group( "date" );

问题是当用户没有指定一个命名组m.group("date")时会出现IllegalArguementException。

我可以很容易地捕获这个异常并尝试获取日期的替代方法,但这基本上是使用控制流的异常。在我试图获得它之前,我宁愿测试该组的存在。我是否错过了某种方式来检查模式中是否存在命名组?

2 个答案:

答案 0 :(得分:1)

java.util.regex.Matcher.group(String name)抛出

  

IllegalArgumentException - 如果模式中没有具有给定名称的捕获组

所以也许您可以使用groupCount()进行基本检查。但我担心你必须处理IllegalArgumentException

答案 1 :(得分:0)

如何在模式上运行regexp匹配(由用户提供,并首先作为普通String处理),检查是否包含组名?

e.g。 .*\(?<date>.+\).*或类似的。