为什么split方法不支持$,* etc分隔符来拆分字符串

时间:2015-04-27 09:03:45

标签: java regex

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());            
  }
}

在上面的示例中,如果我使用$拆分字符串,那么它无法正常工作,如果我正在与其他符号分割,那么它工作正常。

为什么会这样,如果它只支持正则表达式,那么为什么它适用于:,;等符号。

5 个答案:

答案 0 :(得分:6)

$在正则表达式中具有特殊含义,并且由于String#split regex 作为参数,$不会被解释为字符串{{ 1}},但作为特殊meta character "$"。一个性感的解决方案是:

$

Pattern#quote

  

返回指定String的文字模式String。

...另一个解决方案是通过添加settings.split(Pattern.quote("$")) 来逃避$

\\

重要提示:检查您是否在结果数组中确实获得了元素,这一点非常重要。

执行settings.split("\\$") 时,如果没有splitedArray1[0]符号,则可以获得ArrayIndexOutOfBoundsException。我想补充一下:

$

答案 1 :(得分:3)

如果您查看Java文档,您可以看到--all方法将正则表达式作为参数,因此您必须编写正则表达式而不是简单字符。

在正则表达式split中有一个特定的含义,所以你必须以这种方式逃脱它:

$

答案 2 :(得分:2)

美元符号$是Java正则表达式中的特殊字符。你必须逃避它,以便让它像这样工作:

settings.split("\\$");

来自String.split文档:

  

将此字符串拆分为给定正则表达式的匹配项。

     

此方法的工作方式就像通过调用双参数split方法一样   给定的表达式和一个零的限制参数。尾随空   因此,字符串不包含在结果数组中。

旁注:

查看 Pattern class ,它可以让您了解需要逃脱的所有角色。

答案 3 :(得分: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

答案 4 :(得分:1)

因为$是正则表达式中使用的特殊字符,表示表达式的开头。

你应该使用转义序列\ $来转义它,如果是Java,它应该是\ $

希望有所帮助。 干杯