2011-03-19 123 views
7

我需要拆分一个逗号的字符串,但它取决于逗号的放置位置。java - 使用正则表达式拆分字符串

举个例子

考虑以下几点:

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

有没有办法做到这一点?

回答

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 
+0

这工程师!我不认为我会有超过一个级别的括号!谢谢! :D – kkudi 2011-03-19 16:15:37

+0

这比我想到的循环聪明得多。 – 2011-03-19 16:15:40

+1

+1如果'(A,B)'结构中只有一个逗号,那么可以通过在'[^(*)'表达式中添加一个逗号来加速这个''[^(,] * '。 – ridgerunner 2011-03-19 16:28:37

0

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

0

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

相关问题