【问题标题】:How to split a string by comma that is only followed by an alphanumeric character如何用逗号分割字符串,后跟一个字母数字字符
【发布时间】:2019-02-12 18:14:25
【问题描述】:

我正在尝试使用 BufferedReader 来分离一个非常大的 .cvs(255 列),该 BufferedReader 抓取每一行并将其存储在一个字符串中。

我希望能够通过命令和字母来拆分它。 例如:

1,2,3,5,6会分裂成
1 | 2 | 3 | 4 | 5 | 6 | 7

hello,world,good day to you, Sir,test会分裂成
你好 |世界|先生,祝您有美好的一天|测试

请注意我是如何只分隔一个逗号,后面跟一个字母数字。空格前的逗号不分开,而是句子的一部分。

【问题讨论】:

  • ,(?=[a-zA-Z0-9]) 参见regex101.com 进行演示。
  • 您正在寻找“前瞻”。

标签: java regex split


【解决方案1】:

对于每个字符串a:
a.split(",(?=\\S)");

【讨论】:

    【解决方案2】:

    用逗号分隔,后跟字母数字字符,您可以使用

    String pattern = ",(?=\\p{Alnum})";
    

    或者,如果您计划支持任何 Unicode 字母,请传递 Pattern.UNICODE_CHARACTER_CLASS
    ((?U)) 选项旁边的模式:

    String pattern = "(?U),(?=\\p{Alnum})";
    

    请参阅RegexPlanet regex demo

    Java 演示:

    String s = "hello,world,good day to you, Sir,test,1,2";
    String[] result = s.split(",(?=\\p{Alnum})");
    for (String r:result) {
        System.out.println(r); 
    }
    

    输出:

    hello
    world
    good day to you, Sir
    test
    1
    2
    

    【讨论】:

      【解决方案3】:

      在此链接中有一个解释Lookahead and Lookbehind 用法的答案。 在这里我留下一段代码,我相信可以解决你描述的问题:

      private static String[] mySplit(final String line, final char separator) {
          String regex = "((?<=(" + separator + "\\w)|(?=(" + separator + "\\w))))";
          String[] split = line.split(regex);
      
          List<String> list = new ArrayList<>();
          for (int i = 0; i < split.length; i++) {
              String token = split[i];
              if (token.startsWith(String.valueOf(separator))) {
                  split[i + 1] = token.substring(1) + split[i + 1];
              } else {
                  list.add(token);
              }
          }
      
          return list.toArray(new String[list.size()]);
      }
      
      private static String concatenate(final String[] tokens, final char separator){
          StringBuilder builder = new StringBuilder();
          for (int i = 0; i < tokens.length; i++) {
              builder.append(tokens[i]).append((i < tokens.length - 1) ? separator : "");
          }
      
          return builder.toString();
      }
      
      public static void main(String[] args) {
          final String line = "hello,world,good day to you, Sir,test";
          final String[] tokens = mySplit(line, ',');
          final String newLine = concatenate(tokens, '|');
          System.out.println("newLine = " + newLine);
      }
      

      【讨论】:

        猜你喜欢
        • 2020-08-30
        • 2019-10-25
        • 2016-01-17
        • 2014-08-09
        • 2016-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-08
        相关资源
        最近更新 更多