【问题标题】:String delimiter in string.split methodstring.split 方法中的字符串分隔符
【发布时间】:2011-10-24 15:58:05
【问题描述】:

我有以下数据:

1||1||Abdul-Jabbar||Karim||1996||1974

我想分隔标记。

这里的分隔符是"||"

我的分隔符设置器是:

public void setDelimiter(String delimiter) {
    char[] c = delimiter.toCharArray();
    this.delimiter = "\"" + "\\" + c[0] + "\\" + c[1] + "\"";
    System.out.println("Delimiter string is: " + this.delimiter);
}

然而,

String[] tokens = line.split(delimiter);

没有给出所需的结果。

【问题讨论】:

  • 您可以通过给出要拆分的字符集来拆分。例如: string1 = today +1 和 string2 =today -1 ,我们可以使用像 string1.split("[+-]") 或 string2.split("[+-]") 这样的集合来拆分这些字符串,结果将是今天,1

标签: java string split delimiter


【解决方案1】:

无需像您所做的那样通过将分隔符分成几部分来设置分隔符。

这是一个您可以编译和运行的完整程序:

import java.util.Arrays;
public class SplitExample {
    public static final String PLAYER = "1||1||Abdul-Jabbar||Karim||1996||1974";
    public static void main(String[] args) {
        String[] data = PLAYER.split("\\|\\|");
        System.out.println(Arrays.toString(data));
    }
}

如果你想对模式使用split,可以使用Pattern.compilePattern.quote

要查看compilequote 的实际效果,下面是一个使用所有三种方法的示例:

import java.util.Arrays;
import java.util.regex.Pattern;
public class SplitExample {
    public static final String PLAYER = "1||1||Abdul-Jabbar||Karim||1996||1974";
    public static void main(String[] args) {
        String[] data = PLAYER.split("\\|\\|");
        System.out.println(Arrays.toString(data));

        Pattern pattern = Pattern.compile("\\|\\|");
        data = pattern.split(PLAYER);
        System.out.println(Arrays.toString(data));

        pattern = Pattern.compile(Pattern.quote("||"));
        data = pattern.split(PLAYER);
        System.out.println(Arrays.toString(data));
    }
}

如果您要经常使用相同的模式进行拆分,建议使用模式。顺便说一句,输出是:

[1, 1, Abdul-Jabbar, Karim, 1996, 1974]
[1, 1, Abdul-Jabbar, Karim, 1996, 1974]
[1, 1, Abdul-Jabbar, Karim, 1996, 1974]

【讨论】:

  • Sanjay 没有引号的回答有效.. 感谢您的帮助!!
  • 是的,Pattern.quote 是正确的,但就像带有反斜杠的纯字符串一样,如果要拆分多次,它仍然效率低下。在这种情况下,编译模式更有效。仅供参考,我更新了我的答案以显示它是如何使用编译的正则表达式完成的,有和没有引用。
  • 我的分隔符字符串是“\\|\\|” (不包括引号,即 6 个字符)。但是 Pattern.compile(delimiter) 没有按预期工作。但是, Pattern.compile("\\|\\|") 的工作方式与您的代码中显示的一样。我想从外部传入分隔符字符串是什么。 Pattern.compile("\\|\\|") 是硬编码,对吧??
  • 字符串分隔符 = "||";然后 Pattern pattern = Pattern.compile(Pattern.quote(delimiter)); String[] tokens = pattern.split(line);工作..谢谢!
  • 很高兴听到!你搞定了。干净的正则表达式进入你的变量,你将它传递给quote 然后compile 它。现在您可以有效地使用您的模式进行拆分、替换和匹配等。很高兴它可以工作。
【解决方案2】:

使用Pattern#quote() 方法转义||。试试:

final String[] tokens = myString.split(Pattern.quote("||"));

这是必需的,因为| 是一个alternation 字符,因此在传递给split 调用时具有特殊含义(基本上split 的参数是字符串形式的正则表达式)。

【讨论】:

  • 将最终 String[] tokens = myString.split(Pattern.quote(delimiter));工作吗?
  • 我想他知道|有特殊含义;这就是他正在做的被误导的逃跑的全部意义。问题在于他用双引号包围了分隔符。 +1 提及Pattern.quote()
  • nopes.. 这不起作用.. token[0] 正在获取完整的字符串...我将分隔符传递为“||”你是怎么提到的。
  • @Nikunj:你可能做错了什么。您还在尝试使用双引号吗? Sanjay 的解决方案应该可以正常工作。
  • @Nikunj:应该可以。如果没有,请使用更多详细信息更新您的问题。
【解决方案3】:

双引号在正则表达式中被解释为文字;它们不是特殊字符。您正在尝试匹配文字 "||"

只需使用Pattern.quote(delimiter):

根据要求,这是一行代码(与 Sanjay 的相同)

final String[] tokens = line.split(Pattern.quote(delimiter));

如果这不起作用,则说明您没有传入正确的分隔符。

【讨论】:

    【解决方案4】:
    String[] strArray= str.split(Pattern.quote("||"));
    

    在哪里

    1. str = "1||1||阿卜杜勒-贾巴尔||卡里姆||1996||1974";
    2. Pattern.quote("||") 将忽略特殊字符。
    3. .split 函数将在每次出现 || 时分割字符串。
    4. strArray 将包含由 || 分隔的字符串数组。

    【讨论】:

    • 请尝试解释代码:虽然仅代码的答案可能对今天的 OP 有所帮助,但对于将来有相同问题的其他人可能无济于事。
    • @JF 补充说明 ;)
    【解决方案5】:

    管道 (|) 是正则表达式中的特殊字符。要转义它,您需要在它前面加上反斜杠 (\)。但是在java中,反斜杠也是一个转义字符。所以你再次需要用另一个反斜杠来逃避它。所以你的正则表达式应该是\\|\\| 例如, String[] tokens = myString.split("\\|\\|");

    【讨论】:

      【解决方案6】:

      Split 使用的是正则表达式,而管道字符| 在正则表达式中有特殊含义,需要转义。有几种方法可以做到这一点,但这里是最简单的:

      String[] tokens = line.split("\\|\\|");
      

      【讨论】:

        【解决方案7】:

        您的setDelimiter() 函数有问题。您不想双引号分隔符,是吗?

        public void setDelimiter(String delimiter) {
            char[] c = delimiter.toCharArray();
            this.delimiter = "\\" + c[0] + "\\" + c[1];
            System.out.println("Delimiter string is: " + this.delimiter);
        }
        

        但是,正如其他用户所说,如果您的要求允许,最好使用 Pattern.quote() 方法来转义分隔符。

        【讨论】:

          【解决方案8】:

          问题是因为您在分隔符中添加了引号。它应该被删除,它会正常工作。

          public void setDelimiter(String delimiter) {
              char[] c = delimiter.toCharArray();
              this.delimiter = "\\" + c[0] + "\\" + c[1];
              System.out.println("Delimiter string is: " + this.delimiter);
          }
          

          【讨论】:

            【解决方案9】:
            String[] splitArray = subjectString.split("\\|\\|");
            

            你使用一个函数:

            public String[] stringSplit(String string){
            
                String[] splitArray = string.split("\\|\\|");
                return splitArray;
            }
            

            【讨论】:

              【解决方案10】:
              StringTokenizer st = new StringTokenizer("1||1||Abdul-Jabbar||Karim||1996||1974",
                           "||");
              while(st.hasMoreTokens()){
                   System.out.println(st.nextElement());
              }
              

              将打印答案

              1 1 阿卜杜勒-贾巴尔·卡里姆 1996 1974

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2023-04-10
                • 1970-01-01
                • 2011-11-21
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多