【问题标题】:Java - regex to split till the last dotJava - 正则表达式拆分到最后一个点
【发布时间】:2020-08-10 07:42:48
【问题描述】:

我正在尝试使用正则表达式将字符串分成两部分。第一部分应该是所有数字,包括直到最后一个点之间的点。数组的第二部分应该是不包括点的最后一位。 为什么这个正则表达式没有给出预期的结果?

    String str = "12.345.678.90.111.213.1";
    String[] arr  = str.split("[^\\.]([^.]*)$" , 2);

预期输出:

[12.345.678.90.111.213,1]

实际输出:

[12.345.678.90.111.213., ]

【问题讨论】:

    标签: java arrays regex string


    【解决方案1】:

    您可以使用String::substring 轻松完成,而不是使用正则表达式,如下所示:

    import java.util.Arrays;
    
    public class Main {
        public static void main(String[] args) {
            String str = "12.345.678.90.111.213.1";
            if (str.lastIndexOf(".") != -1) {
                String[] arr = { str.substring(0, str.lastIndexOf(".")), str.substring(str.lastIndexOf(".") + 1) };
                System.out.println(Arrays.toString(arr));
            }
        }
    }
    

    输出:

    [12.345.678.90.111.213, 1]
    

    【讨论】:

    • 感谢您的回答。虽然这个解决方案确实产生了预期的结果,但我正在寻找一个可以帮助我做同样事情的正则表达式。
    【解决方案2】:

    str = "12.345.678.90.111.213.1";
    arrMatch = str.match(/(.*)\.(.*)/);
    arr = [arrMatch[1], arrMatch[2]];
    console.log(arr);
    要么
    str = "12.345.678.90.111.213.1";
    arr = str.split(/(.*)\.(.*)/).filter(el => {
        return !!el;
    })
    
    console.log(arr);

    【讨论】:

      【解决方案3】:

      您可以在最后一个点和最后一个点之前的字符之间的零宽度位置拆分字符串:

      (?=\.[^.]+$)
      

      Demo

      【讨论】:

        【解决方案4】:

        您需要正则表达式仅匹配最后一个点,同时确保它后面不再有点。

        要匹配需要转义的点,所以使用\.,然后使用零宽度正向预读来验证字符串的其余部分没有点,即使用@987654322 @

        或者,使用零宽度负前瞻来确保它找不到点,即(?!.*\.)

        我更喜欢第一个,所以使用\.(?=[^.]+$),在Java中意味着"\\.(?=[^.]+$)"

        【讨论】:

          猜你喜欢
          • 2021-12-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-02
          相关资源
          最近更新 更多