【问题标题】:java - split string using regular expressionjava - 使用正则表达式拆分字符串
【发布时间】:2011-07-18 19:15:44
【问题描述】:

我需要在有逗号的地方拆分一个字符串,但这取决于逗号的放置位置。

举个例子

考虑以下几点:

C=75,user_is_active(A,B),user_is_using_app(A,B),D=78

我希望 String.split() 函数像这样将它们分开:

C=75 

user_is_active(A,B) 

user_using_app(A,B)

D=78

我只能想到一件事,但我不确定它在正则表达式中的表达方式。

括号内的字符/单词总是大写。换句话说,我不会有user_is_active(a,b)的情况。

有没有办法做到这一点?

【问题讨论】:

    标签: java regex string split


    【解决方案1】:

    如果您没有多于一层的括号,您可以在一个逗号上进行拆分,该逗号后面没有结尾 ),然后是开头 (

    String[] splitArray = subjectString.split(
        "(?x),   # Verbose regex: Match a comma\n" +
        "(?!     # unless it's followed by...\n" +
        " [^(]*  # any number of characters except (\n" +
        " \\)    # and a )\n" +
        ")       # end of lookahead assertion");
    

    您提议的规则将转换为

    String[] splitArray = subjectString.split(
        "(?x),        # Verbose regex: Match a comma\n" +
        "(?<!\\p{Lu}) # unless it's preceded by an uppercase letter\n" +
        "(?!\\p{Lu})  # or followed by an uppercase letter");
    

    但是你会错过像

    这样的文本中的拆分
    Org=NASA,Craft=Shuttle
    

    【讨论】:

    • 这很完美!我认为我不会有超过一级的括号!谢谢! :D
    • +1 如果(A,B) 结构中只有一个逗号,您可以通过在[^(]* 表达式中添加一个逗号来显着加快速度,即[^(,]*
    • 在我的情况下,我可以有一些东西(A,B,C)所以它不适用,但很高兴知道!谢谢!
    【解决方案2】:

    考虑使用解析器生成器来解析此类查询。例如:javaccantlr

    【讨论】:

      【解决方案3】:

      作为替代方案,如果您需要多于一级的括号,您可以创建一个小的字符串解析器来逐个字符地解析字符串。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多