java如何为这些路径表达式编写正则表达式
我正在尝试编写一个助手方法,它可以分解路径表达式,并希望得到一些帮助。请考虑一个路径模式,如下面的四个(括号表示谓词):
item.sub_element.subsubelement(@key = string)
;或者item..subsub_element(@key = string)
;或者//subsub_element(@key = string)
;或者item(@key = string)
与之匹配的正则表达式是什么样子的
我想到的是:
((/{2}?[\\w+_*])(\\([_=@#\\w+\\*\\(\\)\\{\\}\\[\\]]*\\))?\\.{0,2})+
我的理解是:“匹配由两组组成的字符串的一个或多个出现处:第一组由一个或多个带可选下划线和可选双正斜杠前缀的单词组成;第二组是可选的,至少由一个单词组成,所有其他字符都是可选的;组后面由0到2个点组成。”
但是,在第四个示例上使用Matcher运行了一个测试。matches()返回false。那么,我的错误在哪里
有什么想法吗
蒂亚
FK
编辑:通过尝试使用http://www.regexplanet.com/simple/index.html,我似乎没有意识到Matcher.matches()
对象的Matcher.find()
方法和Matcher
对象的Matcher.find()
方法之间的区别。我试图将输入字符串分解为与正则表达式匹配的子字符串。因此,我需要使用find()
,而不是matches()
伊迪丝2:这就成功了
([a-zA-Z0-9_]+)\.{0,2}(\(.*\))?
# 1 楼答案
您可能会发现此网站对于测试正则表达式的http://www.fileformat.info/tool/regex.htm很有用
作为一种通用方法,尝试从一个处理简单情况的正则表达式构建正则表达式,编写一些测试并使其通过。然后使正则表达式更加复杂,以处理其他情况。确保它通过了原始测试和新测试
# 2 楼答案
我想你误解了人物课。我发现,对于测试正则表达式,http://gskinner.com/RegExr/非常有帮助。作为正则表达式的教程,我推荐http://www.regular-expressions.info/tutorial.html
我不完全确定,您希望如何对字符串进行分组。你的句子似乎暗示,你的第一组只是
item..subsub_element(@key = string)
的item
部分,但我不确定第二组应该是什么。根据我从正则表达式推断的结果,我将把括号前的部分归为第一组,括号中的部分归为第二组。如果我误解了你,你当然可以修改这个我没有对Java的表达式进行转义,所以您必须这样做
第一组应该以可选的双斜杠开始。我用
(?://)?
。这里?:
意味着不应该捕获这个部分,最后一个?
使它前面的组成为可选的接下来是包含字符和下划线的单词,它们按点分组。一个这样的单词(带尾随点)可以表示为
[a-zA-Z_]+\.{0,2}
。我认为,您使用的\w
实际上是[a-zA-Z0-9_]
的快捷方式。它不代表一个单词,而是一个“单词字符”最后一个表达式可能出现多次,因此第一个组的捕获表达式如下所示
对于括号中的部分,可以使用
\([^)]*\)
,这意味着一个开始的括号(转义,因为它有特殊的含义,后面跟着任意数量的非括号(未转义,因为它在字符类中没有特殊的含义),然后是结束的括号结合
^
和$
分别标记行的开始和结束,我们得出如果我误解了您的要求,需要帮助,请在评论中询问
# 3 楼答案
你的模式有很多问题:
/{2}?
:你认为?
在这里是什么意思?因为如果你认为它使/{2}
成为可选的,那你就错了。相反?
是{2}
重复的不情愿的修饰符。也许像(?:/{2})?
这样的东西就是你想要的[\w+_*]
:你认为这里的+
和*
是什么意思?因为如果你认为它们代表重复,那你就错了。这是一个字符类定义,+
和*
字面意思是字符+
和*
。也许你打算。。。事实上,我不确定你的意图解决方案尝试
下面是猜测您的规格的尝试:
然后我们可以按如下方式进行测试:
上述印刷品:
附件