2011-05-25 139 views
5

我正在编写的程序(使用Java)获取由三种部分组成的输入数据,并用斜杠/分隔。部件可以是以下之一:使用正则表达式区分字符串中的斜杠

  1. 匹配正则表达式\w*
  2. 呼叫匹配表达式\w*\(.*\)
  3. 路径匹配表达式<.*>|\".*\"。 A 路径可以包含斜杠。

的示例串看起来是这样的:

bar/foo()/foo(bar)/<foo/bar>/bar/"foo/bar"/foo() 

它具有以下结构

name/call/call/path/name/path/call 

我想拆分此字符串成部分,我试图做到这一点使用正则表达式。我的当前表达式在调用路径后捕获了斜杠,但我无法在名称之后捕获斜线,而不包括路径中可能存在的斜杠。我现在的表情,之后路径电话刚刚捕获斜杠是这样的:

(?<=[\)>\"])/ 

如何展开这种表达后也捕捉斜线不包括内路径斜线?

+1

这将是极大帮助,如果您也说您正则表达式匹配应该包含什么为您的样品字符串,准确。 – Tomalak 2011-05-25 12:44:34

+0

@Tomalak我想要捕捉零件之间的*斜杠*,以便我可以将字符串分开。 – 2011-05-25 12:54:08

+0

如果您使用我建议的表达式,则不需要拆分字符串 - 只需使用匹配。 ;) – Tomalak 2011-05-25 12:56:45

回答

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

我的第一个想法是将斜线与左侧的引号进行匹配。 (即,具有类似(".*")*背后正面看,但这最终在一个异常说

Look-behind group does not have an obvious maximum length 

老实说,我认为你是更好地与一个Matcher,使用或:编在一起的组件版本,(类似\w*|\w*\(.*\)|(<.*>|\".*\"))和while (matcher.find())

3

在你的输入中使用你的字符串不会被转义的内容可能不是最好的选择,但是你的确有奢侈的“虚假”我建议...

  1. 拆分对整个字符串“/”
  2. 解析每个部分,直到到达路径
  3. 开始把路径元素融入到一个列表,直到路径
  4. 结束归队的路径回到“ /“

我强烈建议您考虑转义路径中的”/“,以使您的生活更轻松。

1

这种模式捕捉你的例子字符串的所有部分分别不包括定界符后的结果:

\w+\(.*?\)|<.*>|\".*\"|\w+ 
相关问题