【问题标题】:Splitting string with pipe character ("|") [duplicate]用管道字符(“|”)分割字符串[重复]
【发布时间】:2014-02-26 18:41:22
【问题描述】:

我无法从此字符串中拆分值:

"Food 1 | Service 3 | Atmosphere 3 | Value for money 1 "

这是我当前的代码:

String rat_values = "Food 1 | Service 3 | Atmosphere 3 | Value for money 1 ";
String[] value_split = rat_values.split("|");

输出

[, F, o, o, d, , 1, , |, , S, e, r, v, i, c, e, , 3, , |, , A, t, m, o, s , p, h, e, r, e, , 3, , |, , V, a, l, u, e, , f, o, r, , m, o, n, e, y, , 1, ]

预期输出

食物 1
服务 3
气氛 3
性价比 1

【问题讨论】:

    标签: java regex


    【解决方案1】:

    split 将正则表达式作为参数。| 在正则表达式中具有特殊含义。使用\\| 而不是| 来转义它。

    【讨论】:

      【解决方案2】:

      使用 Pattern.quote()

      String[] value_split = rat_values.split(Pattern.quote("|"));
      
      //System.out.println(Arrays.toString(rat_values.split(Pattern.quote("|")))); //(FOR GETTING OUTPUT)
      

      使用转义字符(用于元字符)

      String[] value_split = rat_values.split("\\|");
      //System.out.println(Arrays.toString(rat_values.split("\\|"))); //(FOR GETTING OUTPUT)
      

      使用 StringTokenizer(避免正则表达式问题)

      public static String[] splitUsingTokenizer(String Subject, String Delimiters) 
      {
           StringTokenizer StrTkn = new StringTokenizer(Subject, Delimiters);
           ArrayList<String> ArrLis = new ArrayList<String>(Subject.length());
           while(StrTkn.hasMoreTokens())
           {
             ArrLis.add(StrTkn.nextToken());
           }
           return ArrLis.toArray(new String[0]);
      }
      

      使用模式类(java.util.regex.Pattern)

      Arrays.asList(Pattern.compile("\\|").split(rat_values))
      //System.out.println(Arrays.asList(Pattern.compile("\\|").split(rat_values))); //(FOR GETTING OUTPUT)
      

      输出

      [Food 1 ,  Service 3 ,  Atmosphere 3 ,  Value for money 1 ]
      

      【讨论】:

      • 第二个版本,你会叫它splitUsingTokenizer("Food 1 | Service 3 | Atmosphere 3 | Value for money 1 ", "|")吗?
      【解决方案3】:
      String rat_values = "Food 1 | Service 3 | Atmosphere 3 | Value for money 1 ";
          String[] value_split = rat_values.split("\\|");
          for (String string : value_split) {
      
              System.out.println(string);
      
          }
      

      【讨论】:

        【解决方案4】:

        或者..Pattern#quote:

        String[] value_split = rat_values.split(Pattern.quote("|"));
        

        这是因为String#split 接受一个正则表达式

        | 有一个special meaning in regex

        quote 将为 regex 返回一个字符串表示形式。

        【讨论】:

        • 赞成实际做 RCA
        【解决方案5】:

        | 是正则表达式中的元字符。你需要逃避它:

        String[] value_split = rat_values.split("\\|");
        

        【讨论】:

        • 我花了大约 15 分钟才找到这个问题,因为我神秘地遇到了同样的问题,并认为这与我的新手(对于 java 8)使用 Array.AsListArrays.stream 有关 - 谢谢devnull!
        • 这在技术上是正确的答案,但 Prateek 的答案要完整得多。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-23
        相关资源
        最近更新 更多