2011-07-30 29 views
0

好的,你可能会说这是一个重复的帖子,但它是不同的。Java - 使用多个分隔符的字符串解析或split()错误

我正在处理某种程序,该程序正在处理用户指定的某种删除分隔符。如果分隔符只是一个单独的字符(特殊与否),我的程序正在工作。但是,如果用户输入是字符串,则会从消息字符串中删除分隔符的所有字符。

前。 String message =“ab \ nc [d] e {fMardk1g(h)i} j”;输出将是:bcefghij 但预期的输出是abcdefghij

我是使用Pattern类的新手,所以我不知道问题出在哪里。

这里的问题(我把它放在一个测试类,所以我可以找出问题)代码:

进口的java.util.regex.Pattern;

public class ParsingTest { 
    public static void main(String[] args) { 
     String[] delimiters = { "Mardk1", "\n", "[", "]", "{", "}", "(", ")" }; 
     StringBuilder regexp = new StringBuilder(""); 
     regexp.append("["); 
     for(String s : delimiters) { 
      regexp.append("["); 
      regexp.append(Pattern.quote(s)); 
      regexp.append("]"); 
     } 
     regexp.append("]"); 

     String message = "ab\nc[d]e{fMardk1g(h)i}j"; 
     StringBuilder result = new StringBuilder(""); 
     String[] a = message.split(regexp.toString()); 
     for(String string : a) { 
      result.append(string); 
     } 
     System.out.println(result); 
     for(String str: a) System.out.print(str); 
     System.out.println(); 
    } 
} 
+0

你产生正则表达式将包含'[Mardk1]'将由字符中的任一项限定'M,A,R,d,k或1 ',这就是为什么你在输出中看不到'a'字符的原因。 – rodion

回答

1

您正在使用错误的分组构造。您正在构建像[xyz]这样的模式,它将匹配任何单个字符x,y或z。你想匹配几个完整的字符串中的任何一个,所以你需要正常的()风格分组,以及交替操作符(|)。有关更多详细信息,请参阅Pattern文档。

尝试此代替建立该正则表达式:

for(String s : delimiters) { 
    // We don't want to start with (| 
    if (regexp.length() > 1) 
    { 
     regexp.append("|"); 
    } 
    regexp.append(Pattern.quote(s)); 
} 
+0

哦,TNX ...你已经解决了我的问题。为什么有必要有“|”在 – JinShin

+0

这两个字之间@JinShin:这是交替运算符,表示它匹配这个或那个或(etc)。因此“(ab | cd | ef)”将匹配“ab”,“cd”或“ef”。 –

+0

哦,tnx再次。我现在明白了。 – JinShin

相关问题