2015-04-27 125 views
4
import java.util.StringTokenizer; 
class MySplit 
{ 
    public static void main(String S[]) 
    { 
    String settings = "12312$12121"; 
    StringTokenizer splitedArray = new StringTokenizer(settings,"$"); 

    String splitedArray1[] = settings.split("$"); 
     System.out.println(splitedArray1[0]); 

    while(splitedArray.hasMoreElements()) 
     System.out.println(splitedArray.nextToken().toString());    
    } 
} 

在上面的例子中,如果我使用$分割字符串,那么它不工作的罚款,如果我与其他符号那么它工作正常分裂。

为什么它是,如果它只支持正则表达式,那么为什么它对:,,,;等符号工作正常。

+0

你必须逃避特殊字符'\ $' – Shriram

+4

,因为'$'是正则表达式中的特殊字符,你必须通过settings.split(“\\ $”)来转义它;' – silentprogrammer

+0

'米不确定:和;是正则表达式中的特殊字符。请参阅标题为“正则表达式结构摘要”一节[此处](http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html) – PakkuDon

回答

6

$在正则表达式的特殊含义,而且由于String#split需要正则表达式作为参数,$不被解释为字符串"$",而是作为特殊meta character$。一个性感的解决方案是:

settings.split(Pattern.quote("$")) 

Pattern#quote

返回指定字符串文字图案的字符串。

...另一个解决办法是逃避$,加入\\

settings.split("\\$") 

重要提示:检查你实际上得到的结果数组中的元素(S)这是非常重要的。

当你做splitedArray1[0],如果没有$符号,你可以得到ArrayIndexOutOfBoundsException。我想补充:

if (splitedArray1.length == 0) { 
    // return or do whatever you want 
    // except accessing the array 
} 
2

美元符号$是Java正则表达式特殊字符。你要逃避它,从而得到它的工作是这样的:

settings.split("\\$"); 

String.split文档:

拆分这串绕定正则表达式的匹配。

此方法类似于调用与 两个参数分割方法给定表达式和零限制参数。因此尾随空 串中不包含所得到的阵列英寸

在一个侧面说明:

看一看在Pattern class,以你需要转义所有字符,这将给你一个想法。

2

的问题是,该方法split(String str)预计str是一个有效的正则表达式。你提到的字符在正则表达式语法的特殊字符,从而执行一个特殊的操作。

为了让正则表达式引擎把他们从字面上看,你需要逃避他们,像这样:

.split("\\$") 

因此给出这样的:

String str = "This is 1st string.$This is the second string"; 
     for(String string : str.split("\\$")) 
      System.out.println(string); 

你结束了这一点:

This is 1st string. 
This is the second strin 
3

如果你看一看的Java文档,你可以看到split方法需要一个正则表达式作为参数,所以你必须写一个正则表达式不是一个简单的人物。

在正则表达式$有特定的含义,所以你必须这样逃避它:

settings.split("\\$"); 
1

因为$是在正则表达式这表明一个表达式开始时使用特殊字符。

你应该使用转义序列\ $逃脱它和Java中的情况下,它应该是\ $

希望有所帮助。 干杯