使用正则表达式分割Java字符串

7

我需要将一个字符串按逗号分割,但取决于逗号的位置。

举个例子:

考虑以下内容:

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) 这样的情况。

有没有办法做到这一点?

3个回答

12

如果你没有超过一个括号层级,你可以在不跟随闭合的)和开口的(之前的逗号上进行分割:

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 - kkudi
1
如果(A,B)结构内只有一个逗号,你可以通过在[^(]*表达式中添加逗号,即[^(,]*,大大加快速度。+1 - ridgerunner
在我的情况下,我可能会有一些(A、B、C),所以它不适用,但知道这点很好!谢谢! - kkudi

0

考虑使用解析器生成器来解析这种类型的查询。例如:javaccantlr


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接