2011-03-19 121 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

作爲替代方案,如果您需要多個括號級別,則可以創建一個用於逐字符地解析字符串的小字符串解析器。

相關問題