我正在编写的程序(用Java编写)获取由三种部分组成的输入数据,用斜杠/
分隔。部件可以是以下之一:
\w*
\w*\(.*\)
<.*>|\".*\"
匹配的路径。 路径可以包含斜杠。示例字符串可能如下所示:
bar/foo()/foo(bar)/<foo/bar>/bar/"foo/bar"/foo()
具有以下结构
name/call/call/path/name/path/call
我想将此字符串拆分为多个部分,我正在尝试使用正则表达式。我的当前表达式在调用和路径之后捕获斜杠,但是我无法在名称之后捕获斜杠而不包括可能的斜杠存在于路径中。我当前的表达式,只是在路径和调用之后捕获斜杠,如下所示:
(?<=[\)>\"])/
如何扩展此表达式以在名称之后捕获斜杠而不在路径中包含斜杠?
答案 0 :(得分:3)
我的第一个想法是将斜线与左边的偶数引号匹配。 (即,对(".*")*
之类的东西有一个积极的看法,但最终会出现例外情况
Look-behind group does not have an obvious maximum length
老实说,我认为你使用Matcher
更好,使用你的组件的or:ed编译版本(类似\w*|\w*\(.*\)|(<.*>|\".*\")
)和while (matcher.find())
。
答案 1 :(得分:3)
在输入中使用字符串的deliminator未被转义可能不是最佳选择。但是,你确实在常规模式中有“假”斜线的奢侈。我的建议......
我强烈建议您考虑逃离路径中的“/”以使您的生活更轻松。
答案 2 :(得分:3)
(\w+|\w+\([^/]*\)(?:/\w+\([^/]*\))*|<[^>]*>|"[^"]*")(?=/|$)
从字符串'bar/foo()/foo(bar)/<foo/bar>/bar/"foo/bar"/foo()'
'bar'
'foo()/foo(bar)'
'<foo/bar>'
'bar'
'"foo/bar"'
'foo()'
它不捕获分离斜线,但是(为什么? - 只是假设它们在那里)。
更简单的(\w+|\w+\([^/]*\)|<[^>]*>|"[^"]*")(?=/|$)
将分别捕获调用:
"foo()"
"foo(bar)"
( # begin group 1 (for alternation) \w+ # at least one word character | # or... \w+ # at least one word character \( # a literal "(" [^/]* # anything but a "/", as often as possible \) # a literal ")" | # or... < # a "<" [^>]* # anything but a ">", as often as possible > # a ">" | # or... " # a '"' [^"]* # anything but a '"', as often as possible " # a '"' ) # end group 1 (?=/|$) # look-ahead: ...followed by a slash or the end of string
答案 3 :(得分:1)
此模式分别捕获示例字符串的所有部分,而不将分隔符包含在结果中:
\w+\(.*?\)|<.*>|\".*\"|\w+