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

Java 使用正则表达式区分字符串中的斜杠,java,regex,Java,Regex,我正在编写的一个程序(用Java)获取由三种部分组成的输入数据,用斜杠分隔。这些零件可以是以下零件之一: 与正则表达式匹配的名称\w* 与表达式\w*\(.*) 与表达式\\“*\”匹配的路径。路径可以包含斜杠 示例字符串可能如下所示: bar/foo()/foo(bar)/<foo/bar>/bar/"foo/bar"/foo() 我想把这个字符串分成几个部分,我正试图用正则表达式来实现这一点。我当前的表达式捕获调用和路径后的斜杠,但我很难让它捕获名称后的斜杠,而不包括路径中可能

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

  • 与正则表达式匹配的名称
    \w*
  • 与表达式
    \w*\(.*)
  • 与表达式
    \\“*\”
    匹配的路径。路径可以包含斜杠
  • 示例字符串可能如下所示:

    bar/foo()/foo(bar)/<foo/bar>/bar/"foo/bar"/foo()
    
    我想把这个字符串分成几个部分,我正试图用正则表达式来实现这一点。我当前的表达式捕获调用和路径后的斜杠,但我很难让它捕获名称后的斜杠,而不包括路径中可能存在的斜杠。我当前的表达式,仅在路径和调用后捕获斜杠如下所示:

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

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

    我的第一个想法是将斜杠与其左侧偶数个引号进行匹配(即,对类似于
    (“*”)*
    的内容进行正面查看,但最终会出现以下异常:

    Look-behind group does not have an obvious maximum length
    

    老实说,我认为您最好使用
    匹配器
    ,使用组件的or:ed版本(类似于
    \w*\w*\(.*\)(|\“*”)
    )和
    while(Matcher.find())

    在输入中使用字符串的清除器时,不转义它可能不是最好的选择。但是,在规则模式中使用“假”斜杠确实是一种奢侈。我建议

  • 在“/”上拆分整个字符串
  • 解析每个部分,直到到达路径的开头
  • 将路径元素放入列表中,直到路径结束
  • 在“/”上重新加入路径

  • 我强烈建议你考虑在你的路径中逃避“/”以使你的生活更容易。

    < P>单独捕获示例字符串的所有部分,而不将定界符包含在结果中:

    (\w+|\w+\([^/]*\)(?:/\w+\([^/]*\))*|<[^>]*>|"[^"]*")(?=/|$)
    
    \w+\(.*?\)|<.*>|\".*\"|\w+
    
    \w+\(.*?\)\124; | \“*\”\w+
    
    如果您还准确地说出了示例字符串的正则表达式匹配应包含的内容,那将非常有帮助。@Tomalak我想捕获部分之间的斜线,以便我可以拆分字符串。如果您使用我建议的表达式,则无需拆分字符串-只需使用匹配项即可。;)@是的,当我读到你和艾奥贝的答案时,我意识到了这一点。这证明了征求他人意见的价值。非常感谢。 ( # 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
    \w+\(.*?\)|<.*>|\".*\"|\w+