regex 如何在java中拆分一个从右边开始的限制字符串?

eiee3dmh  于 2023-04-22  发布在  Java
关注(0)|答案(4)|浏览(155)

没有限制的拆分,拆分整个字符串,但是如果你设置了限制,它会从左边拆分到那个限制,我怎么能从右边做同样的事情呢?

"a.b.c".split("[.]", 2); // returns ["a", "b.c"]

我想

"a.b.c".splitRight("[.]", 2); // to return ["a.b", "c"]

编辑:我想要一个通用的解决方案,就像拆分,但反过来,所以我添加了一个更复杂的例子
我想

"a(->)b(->)c(->)d".splitRight("\\(->\\)", 3); // to return ["a(->)b", "c", "d"]
6tqwzwtp

6tqwzwtp1#

你可以使用look-ahead match:

"a.b.c".split("[.](?=[^.]*$)")

这里你说“我只想用那个后面没有其他点的点来分割”。
如果你想用最后N个点来分割,你可以用这种(更丑陋的方式)来概括这个解决方案:

"dfsga.sdgdsb.dsgc.dsgsdfg.dsdg.sdfg.sdf".split("[.](?=([^.]*[.]){0,3}[^.]*$)");

3替换为N-2
但是我会写一个简短的静态方法:

public static String[] splitAtLastDot(String s) {
    int pos = s.lastIndexOf('.');
    if(pos == -1)
        return new String[] {s};
    return new String[] {s.substring(0, pos), s.substring(pos+1)};
}
7d7tgy0s

7d7tgy0s2#

我会尝试这样的东西:

public List<String> splitRight(String string, String regex, int limit) {
    List<String> result = new ArrayList<String>();
    String[] temp = new String[0];
    for(int i = 1; i < limit; i++) {
        if(string.matches(".*"+regex+".*")) {
            temp = string.split(modifyRegex(regex));
            result.add(temp[1]);
            string = temp[0];
        }
    }
    if(temp.length>0) { 
        result.add(temp[0]);
    }
    Collections.reverse(result);
    return result;
}

public String modifyRegex(String regex){
    return regex + "(?!.*" + regex + ".*$)";
}

split的正则表达式被另一个正则表达式 Package ,因此对于\\.,您将得到:\\.(?!.*\\..*$),匹配并在最后一次出现分隔符时拆分。使用此正则表达式对字符串进行多次拆分,结果数组的第二个元素添加到List中,下一次拆分在结果数组的第一个元素上完成。
上面的方法对你的示例字符串的效果和预期的一样。

6fe3ivhb

6fe3ivhb3#

尽管你说反转会花很长时间,这里有一个小程序,它尊重字符串并按限制拆分它;

static String[] leftSplit(String input, String regex, int limit) {
    String reveresedInput = new StringBuilder(input).reverse().toString();
    String[] output = reveresedInput.split(regex, limit);
    String tempOutput[] = new String[output.length];
    for(int i = 0;i<output.length;++i) {
        tempOutput[tempOutput.length-i-1] = new StringBuilder(output[i]).reverse().toString();
    }
    return tempOutput;
}

public static void main(String[] args) {
    System.out.println(Arrays.toString(leftSplit("a.b.c", "[.]", 2)));
    System.out.println(Arrays.toString(leftSplit("I want to. Split this. by the. right side", "[.]", 2)));
}
jdzmm42g

jdzmm42g4#

性能不是很好,但可读性比上面的一些例子好:

List l = Arrays.stream(new StringBuilder("a.b.c").reverse().toString().split("\\.", 2))
.map(StringBuilder::new).map(StringBuilder::reverse).collect(toList());
Collections.reverse(l);

相关问题