使用正则表达式区分字符串中的斜杠

时间:2011-05-25 12:28:18

标签: java regex

我正在编写的程序(用Java编写)获取由三种部分组成的输入数据,用斜杠/分隔。部件可以是以下之一:

  1. 与正则表达式\w*
  2. 匹配的名称
  3. 与表达式\w*\(.*\)
  4. 匹配的调用
  5. 与表达式<.*>|\".*\"匹配的路径路径可以包含斜杠。
  6. 示例字符串可能如下所示:

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

    具有以下结构

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

    我想将此字符串拆分为多个部分,我正在尝试使用正则表达式。我的当前表达式在调用路径之后捕获斜杠,但是我无法在名称之后捕获斜杠而不包括可能的斜杠存在于路径中。我当前的表达式,只是在路径调用之后捕获斜杠,如下所示:

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

    如何扩展此表达式以在名称之后捕获斜杠而不在路径中包含斜杠?

4 个答案:

答案 0 :(得分:3)

我的第一个想法是将斜线与左边的偶数引号匹配。 (即,对(".*")*之类的东西有一个积极的看法,但最终会出现例外情况

Look-behind group does not have an obvious maximum length

老实说,我认为你使用Matcher更好,使用你的组件的or:ed编译版本(类似\w*|\w*\(.*\)|(<.*>|\".*\"))和while (matcher.find())

答案 1 :(得分:3)

在输入中使用字符串的deliminator未被转义可能不是最佳选择。但是,你确实在常规模式中有“假”斜线的奢侈。我的建议......

  1. 将整个字符串拆分为“/”
  2. 解析每个部分,直到到达路径的开头
  3. 将路径元素放入列表中,直到路径末尾
  4. 重新加入“/”
  5. 上的路径

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

答案 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+