1

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

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。

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

4

2 回答 2

1

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

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

所以也许你可以groupCount()用来做一个基本的检查。但我担心你必须处理IllegalArgumentException.

于 2013-03-08T09:10:01.903 回答
0

如何在模式上运行正则表达式匹配(由用户提供,并首先作为纯字符串处理)来检查是否包含组名?

例如.*\(?<date>.+\).*或类似的。

于 2013-03-08T09:15:22.777 回答