【问题标题】:Split string with | separator in java用 | 分割字符串java中的分隔符
【发布时间】:2011-09-12 10:29:10
【问题描述】:

我有一个这样的字符串:1|"value"|;

我想拆分该字符串并选择| 作为分隔符。

我的代码如下所示:

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

我得到的是一个包含所有字符作为一个条目的数组:

separated[0] = ""
separated[1] = "1"
separated[2] = "|"
separated[3] = """
separated[4] = "v"
separated[5] = "a"
...

有人知道为什么吗?
我不能用| 分割一个字符串吗?

【问题讨论】:

    标签: java string split


    【解决方案1】:

    这是您可以用于此目的的通用方法。它将处理任何分隔符。
    Pattern.quote 具有魔力。

    import org.apache.commons.lang3.StringUtils;
    
    public static String[] split(String strToSplit, String delimiter) {
        if (StringUtils.isBlank(strToSplit)) {
            return new String[] {};
        } else if (StringUtils.isBlank(delimiter)) {
            return new String[] { strToSplit };
        }
    
        return strToSplit.split(Pattern.quote(delimiter));
    }
    

    在你的例子中:

    String[] separated = split(line, "|");
    

    【讨论】:

      【解决方案2】:
      Pattern.compile("|").splitAsStream(String you want to split).collect(Collectors.toList());
      

      【讨论】:

        【解决方案3】:

        你可以在分割之前用另一个字符比如'#'替换管道,试试这个

        String[] seperated = line.replace('|','#').split("#");
        

        【讨论】:

          【解决方案4】:

          | 在 RegEx 中被视为 OR。所以你需要逃避它:

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

          【讨论】:

          • 如果您的分隔符是动态的,line.split("\\" + separator) 将无法与 ;, 一起使用。另一个解决方案是line.split("[" + separator + "]"),因为括号中的字符也会被转义。
          【解决方案5】:
          public class StringUtil {
          
            private static final String HT = "\t";
            private static final String CRLF = "\r\n";
          
            // This class cannot be instantiated
            private StringUtil() {
            }
          
            /**
             * Split the string into an array of strings using one of the separator in
             * 'sep'.
             * 
             * @param s
             *            the string to tokenize
             * @param sep
             *            a list of separator to use
             * 
             * @return the array of tokens (an array of size 1 with the original string
             *         if no separator found)
             */
            public static String[] split(final String s, final String sep) {
              // convert a String s to an Array, the elements
              // are delimited by sep
              final Vector<Integer> tokenIndex = new Vector<Integer>(10);
              final int len = s.length();
              int i;
          
              // Find all characters in string matching one of the separators in 'sep'
              for (i = 0; i < len; i++)
                if (sep.indexOf(s.charAt(i)) != -1)
                  tokenIndex.addElement(new Integer(i));
          
              final int size = tokenIndex.size();
              final String[] elements = new String[size + 1];
          
              // No separators: return the string as the first element
              if (size == 0)
                elements[0] = s;
              else {
                // Init indexes
                int start = 0;
                int end = (tokenIndex.elementAt(0)).intValue();
                // Get the first token
                elements[0] = s.substring(start, end);
          
                // Get the mid tokens
                for (i = 1; i < size; i++) {
                  // update indexes
                  start = (tokenIndex.elementAt(i - 1)).intValue() + 1;
                  end = (tokenIndex.elementAt(i)).intValue();
                  elements[i] = s.substring(start, end);
                }
                // Get last token
                start = (tokenIndex.elementAt(i - 1)).intValue() + 1;
                elements[i] = (start < s.length()) ? s.substring(start) : "";
              }
          
              return elements;
            }
          
          }
          

          【讨论】:

            【解决方案6】:

            |在正则表达式中表示 OR,您应该转义它。更重要的是,一个'\',你得到'\|'在 Java 字符串中没有任何意义。所以你也应该转义'\'本身,它会产生'\|'。

            祝你好运!

            【讨论】:

              【解决方案7】:

              这样是行不通的,因为你必须逃离管道 |第一的。 以下示例代码(位于 (http://www.rgagnon.com/javadetails/java-0438.html))显示了一个示例。

              public class StringSplit {
                public static void main(String args[]) throws Exception{
                  String testString = "Real|How|To";
                  // bad
                  System.out.println(java.util.Arrays.toString(
                      testString.split("|")
                  ));
                  // output : [, R, e, a, l, |, H, o, w, |, T, o]
              
                  // good
                  System.out.println(java.util.Arrays.toString(
                    testString.split("\\|")
                  ));
                  // output : [Real, How, To]
                }
              }
              

              【讨论】:

                【解决方案8】:

                split 方法的参数是一个正则表达式,您可以阅读here。由于|在正则表达式中有特殊含义,需要对其进行转义。然后代码看起来像这样(正如其他人已经展示的那样):

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

                【讨论】:

                  【解决方案9】:

                  逃离管道。它有效。

                  String.split("\\|");
                  

                  管道是正则表达式中的特殊字符,意思是或

                  【讨论】:

                    【解决方案10】:

                    您必须转义 |,因为它在正则表达式中具有特殊含义。看看split(..) 方法。

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

                    第二个\ 用于转义|,第一个\ 用于转义第二个\ :)。

                    【讨论】:

                    • 为什么不需要第三个 \ 就可以无限期地转义第二个 \ 等等?
                    【解决方案11】:

                    String.split() 使用正则表达式,因此您需要转义 '|'比如 .split("\\|");

                    【讨论】:

                      【解决方案12】:

                      试试这个:String[] separated = line.split("\\|");

                      我的答案更好。我更正了“分离”的拼写:)

                      另外,这行得通的原因是什么? | 在正则表达式中表示“或”。你需要逃避它。

                      【讨论】:

                        猜你喜欢
                        • 2013-05-03
                        • 2021-06-12
                        • 2017-03-25
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多