Java 测试是否存在命名的捕获组
我有一段代码,根据用户提供的正则表达式从字符串中提取日期。配置系统有几种不同的方法,但通常用户最方便的方法是指定一个命名的捕获组,然后代码从中提取日期。例如:Java 测试是否存在命名的捕获组,java,regex,Java,Regex,我有一段代码,根据用户提供的正则表达式从字符串中提取日期。配置系统有几种不同的方法,但通常用户最方便的方法是指定一个命名的捕获组,然后代码从中提取日期。例如: Input: ABC-20130308 Regex: ABC-(?<date>\d{8}) 问题是,当用户没有指定一个命名组m.group(“日期”)时,就会出现IllegalArguementException 我可以很容易地捕捉到这个异常,并尝试其他方法来获取日期,但这基本上是使用异常进行控制流。我宁愿先测试一下这个群体
Input: ABC-20130308
Regex: ABC-(?<date>\d{8})
问题是,当用户没有指定一个命名组m.group(“日期”)
时,就会出现IllegalArguementException
我可以很容易地捕捉到这个异常,并尝试其他方法来获取日期,但这基本上是使用异常进行控制流。我宁愿先测试一下这个群体的存在,然后再去尝试。我是否错过了一些检查模式中是否存在命名组的方法?抛出一个
IllegalArgumentException-如果模式中没有具有给定名称的捕获组
所以也许你可以做一个基本的检查。但我担心您必须处理非法argumentexception
引发的
IllegalArgumentException-如果模式中没有具有给定名称的捕获组
所以也许你可以做一个基本的检查。但是我担心您必须处理
IllegalArgumentException
对模式(由用户提供,并首先作为普通字符串处理)运行regexp匹配以检查是否包含组名,如何?
e、 g.
*\(?.+\).
或类似的模式。如何在模式(由用户提供,并首先作为普通字符串处理)上运行regexp匹配,以检查是否包含组名?
e、 g.
*\(?。+\).*
或类似工具。从Matcher实现的MatchResult接口没有组方法,只包含String->IllegaArgument异常。似乎无法使用Java接口中的名称。您必须使用组的位置。在您的示例中,这将是m.group(1)。这不是你问题的答案,而是一个可能的解决办法。在复杂正则表达式中,最好使用组名而不是位置。但是看起来,您只能在表达式本身的引用中使用该名称。也许我误解了您的意思,但只要您使用Java 7或更高版本,就可以很容易地从代码内部调用group(String)方法。我自己的regex tester(我在文档中阅读了命名组的规范,因此选择命名组的正则表达式应该是正确的)@wobblycogs您的权利,我只查看了1.6 Javadoc。Matcher实现的MatchResult接口没有组方法,除了String->IllegaArgument异常。似乎您无法使用Java接口中的名称。您必须使用组的位置。在您的示例中,这将是m.group(1)。这不是您问题的答案,而是一种可能的解决方法。在复杂正则表达式中,最好使用组名,而不是位置。但看起来,您只能在表达式本身中引用该名称。也许我误解了您,但您可以调用组(字符串)只要您使用Java 7或更高版本,就可以很容易地从内部代码中获取方法@wobblycogs你说得对,我只研究了1.6javadoc。我真的很喜欢这个想法,但不幸的是,在我的情况下,它不起作用-它很复杂,但归结为一个事实,该组可能不被称为“日期”,这只是默认名称,而且在我进入“有趣”页面时,该模式实际上已经编译好了代码。@wobblycogs类模式
:公共字符串模式()
返回从中编译此模式的正则表达式。显然,您也不需要硬编码字符串中与组名相对应的部分。@wobblycogs仔细想想,您总是可以从提供的模式中提取组名,例如*\(?。+\).*
@fr13dwin:您的想法是正确的,但您的正则表达式在一般情况下不起作用。@nhahdh,我明白了-escapes和所有这些:-S。好吧,这是一个一般的想法,我相信wobblycogs可以改进正则表达式,直到它在他的环境下正常工作。或者只需使用编号组,因为命名组也仍然使用编号。…我真的很喜欢这个想法,但不幸的是,在我的情况下,它不起作用-它很复杂,但归结起来,事实上,该组可能不被称为“日期”,这只是默认名称,在我到达“有趣”时,该模式实际上已经编译好了代码。@wobblycogs类模式
:公共字符串模式()
返回从中编译此模式的正则表达式。显然,您也不需要硬编码字符串中与组名相对应的部分。@wobblycogs仔细想想,您总是可以从提供的模式中提取组名,例如*\(?。+\).*
@fr13dwin:您的想法是正确的,但您的正则表达式在一般情况下不起作用。@nhahdh,我明白了-escapes和所有这些:-S。好吧,这是一个一般的想法,我相信wobblycogs可以改进正则表达式,直到它在他的环境下正常工作。或者只需使用编号组,因为命名组也仍然使用编号。…我已经对其进行了编码以处理异常。groupCount的想法可能有效,但如果我扩展系统以从文本中获取其他数据,则会非常笨拙且容易出错。感觉好像缺少了一些API。我已经对其进行了编码以处理异常。groupCount的想法可能有效,但会非常笨拙且非常错误如果我扩展了系统来从文本中获取其他数据的话,就很容易出错。感觉好像缺少了一点API。
Pattern p = Pattern.compile( regex );
Matcher m = p.matcher( input );
m.find();
m.group( "date" );