【问题标题】:Split string without losing split character拆分字符串而不丢失拆分字符
【发布时间】:2015-01-11 20:59:21
【问题描述】:

我想在Java中拆分一个字符串这样的字符串,正常的拆分函数会拆分字符串同时丢失拆分字符:

String = "123{456]789[012*";

我想将字符串拆分为{,[,],* 字符,但不想丢失它们。我的意思是我想要这样的结果:

part 1 = 123{
part 2 = 456]
part 3 = 789[
part 4 = 012*

通常拆分函数是这样拆分的:

part 1 = 123
part 2 = 456
part 3 = 789
part 4 = 012

有可能吗?

【问题讨论】:

    标签: java regex string split


    【解决方案1】:

    使用positive lookbehind

    (?<={|\[|\]|\*)
    

    String str = "123{456]789[012*";
    String parts[] = str.split("(?<=\\{|\\[|\\]|\\*)");
    System.out.println(Arrays.toString(parts));
    

    输出:

    [123{, 456], 789[, 012*]
    

    【讨论】:

      【解决方案2】:

      您可以使用零宽度前瞻/后置表达式来定义一个正则表达式,以匹配零长度字符串您的一个目标字符和任何不是您的目标字符之一的字符串:

      (?<=[{\[\]*])(?=[^{\[\]*])
      

      将此表达式传递给String.split:

      String[] parts = "123{456]789[012*".split("(?<=[{\\[\\]*])(?=[^{\\[\\]*])");
      

      如果您有一个连续的分隔符块,它将在整个块的末尾拆分一次,即字符串"123{456][789[012*" 将拆分为四个块"123{", "456][", "789[", "012*"。如果您只使用了第一部分(后视)

      (?<=[{\[\]*])
      

      那么你会得到五个部分"123{", "456]", "[", "789[", "012*"

      【讨论】:

      • 你能给我看一点代码吗,因为我很理解,如何向前/向后看
      • @RecreatioN 有帮助吗?零宽度前瞻(?=X) 匹配表达式X 的任何匹配之前的点,后瞻匹配紧随其后的点。
      • 非常感谢,这正是我想要的
      【解决方案3】:

      我认为您正在寻找类似的东西

      String str = "123{456]789[012*";
      String[] parts = new String[] {
              str.substring(0,4), str.substring(4,8), str.substring(8,12),
              str.substring(12)
      };
      System.out.println(Arrays.toString(parts));
      

      输出是

      [123{, 456], 789[, 012*]
      

      【讨论】:

      • 但是那个字符串是一个例子,所以我需要一个一般的近似值来分割长字符串
      • @RecreationN 你必须更具体。这是将长度为 16 的 String 拆分为 4 个 4 字符 Strings 的通用算法。如果你需要别的东西,你需要解释那是什么。
      【解决方案4】:

      您可以使用PatternMatcher 来查找拆分字符和拆分字符本身之后的下一个索引。

      public static List<String> split(String string, String splitRegex) {
          List<String> result = new ArrayList<String>();
      
          Pattern p = Pattern.compile(splitRegex);
          Matcher m = p.matcher(string);
          int index = 0;
          while (index < string.length()) {
              if (m.find()) {
                  int splitIndex = m.end();
                  String splitString = m.group();
                  result.add(string.substring(index,splitIndex-1) + splitString);
                  index = splitIndex;
              } else
                  result.add(string.substring(index));
          }
          return result;
      }
      

      示例代码:

      public static void main(String[] args) {
          System.out.println(split("123{456]789[012*","\\{|\\]|\\[|\\*"));
      }
      

      输出:

      [123{, 456], 789[, 012*]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-06
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        • 2011-12-31
        • 1970-01-01
        • 2011-10-13
        相关资源
        最近更新 更多