2009-07-03 8 views
2

在Java中,我使用字符串拆分方法拆分包含以分號分隔的值的字符串。如何使用排除我的令牌的轉義版本的正則表達式分割字符串?

目前,我有以下線在99%的情況下工作。

String[] fields = optionsTxt.split(";"); 

但是,該要求已被添加以包含作爲字符串的一部分的轉義分號。所以,下面的字符串應該解析出以下值:

"Foo foo;Bar bar" => [Foo foo] [Bar bar] 
"Foo foo\; foo foo;Bar bar bar" => [Foo foo\; foo foo] [Bar bar bar] 

這應該是痛苦地簡單,但我完全不知道如何去做。我只是想在沒有\時標記化;只有有一個時才標記。

有沒有人知道這個神奇的公式?

+1

令牌是否包含反斜槓?如果是這樣,他們也必須逃脫,對吧? – 2009-07-03 01:51:21

+0

在我的用例中,令牌是一個從不轉義的單個分號。如果你想有一個反斜槓的標記,那麼你需要另一種方法。 – Elijah 2009-07-10 19:44:02

回答

2

試試這個:

String[] fields = optionsTxt.split("(?<!\\\\);"); 
1

可能有更好的方法,但快速和骯髒的方法將首先替換\;用一些不會出現在輸入緩衝區中的字符串,例如{{ESCAPED_SEMICOLON}},然後執行tokenize;然後,當您取出每個令牌時,執行原始替換操作以反向放回\;

+0

這比使用正則表達式更簡單。 :) – nightingale2k1 2009-07-03 02:17:54

0

只用你提供的例子,你可以使用對象的代碼從上面。如果你希望發生分裂,只有當有偶數您的分號之前的反斜槓,試試這個:

String[] fields = optionsTxt.split("((?<!\\\\)|(?<=[^\\\\](\\\\\\\\){0,15}));"); 

我挑選15隨意。如果需要,將其更改爲更高的數字。

相關問題