2011-04-15 104 views
18

我想解析一個txt文件,它表示要在遞歸下降解析器中使用的語法。 txt文件將是這個樣子:Java字符串拆分不返回正確的值

SPRIME :: = Expr的EOF
Expr的:: =期限Expr的 '
Expr的' :: = +比率Expr的」 | - 術語Expr'| Ë

要隔離左側和右側分割成獨立的生產規則,我把每一行,並撥打:

String[] firstSplit = line.split("::="); 
String LHS = firstSplit[0]; 
String productionRules = firstSplit[1].split("|"); 

然而,當我打電話第二分割法,我不回來由「|」分隔的字符串數組字符,而是右側的每個單獨字符的數組,包括「|」。因此,舉例來說,如果我被解析Expr的 '規則和打印productionRules陣列,它應該是這樣的:

「+」
「期限」
「Expr的'」
「」
「| 「

當我真正想應該是這樣的:

  • 期限Expr的」

任何人有什麼,我做錯了什麼想法?

回答

21

由於split需要一個正則表達式作爲參數,所以您必須轉義所有非預期的正則表達式符號。

46

String.split()的參數是的正則表達式,垂直欄字符是特殊的。

嘗試用一個反斜槓它:

String productionRules = firstSplit[1].split("\\|"); 

注:兩個反斜槓是必需的,因爲反斜槓字符本身的字符串中的特殊。

+0

非常感謝您,我知道這是與正則表達式有關的事情,現在就開始吧! – 2011-04-15 11:28:40

+0

在這裏傳統的做法是提出正確答案並「接受」你最喜歡的答案。 – Alnitak 2011-04-15 12:13:04

+0

目前有11名代表,@Richard實際上無法登錄。但接受答案肯定是禮貌的。 – 2011-04-15 12:20:09

11

您需要逃避管道(|)符號這是一個regexOR運算符。

String productionRules = firstSplit[1].split("\\|"); 

String productionRules = firstSplit[1].split(Pattern.quote("|")); 
7

管道字符爲 「或」 正則表達式運算符。你想要的是

String productionRules = firstSplit[1].split("\\|"); 

它告訴它尋找一個實際的管道字符。

相關問題