【问题标题】:What's a good way to split a non-delimited string in Java?在 Java 中拆分非定界字符串的好方法是什么?
【发布时间】:2012-03-17 22:04:07
【问题描述】:

我想将 EADGBE 或 DADF#AD 形式的字符串拆分为单独的字符串,每个字符串包含一个字母或一个字母加 # 号。有没有比使用蛮力遍历字符串更优雅的方法?

String.split 显然依赖于分隔符,然后将其丢弃,这对我来说根本没有多大用处 - 有几分钟我认为 split("[a-gA-G]#?"); 会起作用,但不,这没有帮助完全 - 我几乎想要相反的......

【问题讨论】:

  • 你能举一个你想分割的字符串的例子吗?
  • 恐怕你必须采用蛮力方法
  • 这是微不足道的。去蛮力吧。不要添加正则表达式的复杂性和概述。

标签: java string split


【解决方案1】:

就代码和性能而言,蛮力可能是您的最佳选择。

或者,您可以使用Matcher

Pattern p = Pattern.compile("[a-gA-G]#?");
Matcher m = p.march(inputString);
List<String> matches = new ArrayList<String>();
while(m.find())
   matches.add(m.group());

【讨论】:

  • 啊,非常好 - 我的谷歌搜索都没有找到任何关于 Matchers 的信息!感谢那。 :)
【解决方案2】:

如果您预见到模式的变化,您可以使用:

  String s = "DADF#AD"; 
  Pattern p = Pattern.compile("([a-gA-G]#?)");
  Matcher matcher = p.matcher(s);
  while (matcher.find()) {
      System.out.println(matcher.group());
  }

【讨论】:

    【解决方案3】:

    使用前瞻和后向工作:String regex = "(?&lt;=.)(?=\\w#?)";

    例如,

    import java.util.Arrays;
    
    public class Foo {
       public static void main(String[] args) {
          String[] tests = {"EADGBE", "DADF#AD"};
          String regex = "(?<=.)(?=\\w#?)";
          for (String test : tests) {
             System.out.println(Arrays.toString(test.split(regex)));
          }
       }
    }
    

    返回:

    [E、A、D、G、B、E]
    [D、A、D、F#、A、D]

    【讨论】:

    • String regex = "(?=(?!^)\\w#?)";,给你。
    • @refp: 看起来也可以——防止线路开始被捕获。光滑,谢谢!
    • 啊...我不知道这是一个选项!也许不是对人类最友好的技术——或者我的意思是对新手友好——但意识到这是你可以用 Java 中的正则表达式做的事情,这绝对是件好事。谢谢!
    • @Oolong:这是实际的解决方案——您要求使用正则表达式与String#split(...) 一起使用。所有其他答案都不满足此要求。
    • 不完全是......当我说我想分割一个字符串时,我并不是说我一定要split() a String!不过我知道你来自哪里。
    【解决方案4】:

    怎么样:添加分隔符,然后拆分:

    此方法添加分隔符

    private static String delimit(String in) {
      StringBuilder sb = new StringBuilder();
      for (int i = 0; i < in.length()-1; i++) {
        sb.append(in.charAt(i));
        if (in.charAt(i+1) != '#')
          sb.append(';');
      }
      return sb.toString();
    }
    

    使用它:

    String[] notes = delimit("DADF#AD").split(";");
    

    【讨论】:

    • 为什么不使用 for 循环来生成标记列表,而不是构建不必要的中间字符串?
    • @Dunes 我已经在 SO 上发布了几十个这样的标准解决方案——只是想做一些不同的事情;)
    • 嘿!我想这会奏效,是的。我确实想知道插入分隔符,但我认为必须有一种更简单的方法......正如其他用户所指出的那样,有!但无论如何,谢谢,了解替代品是健康的......
    猜你喜欢
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多