正则表达式提取倒序文本,直到第三个字符的实例。

6
我有一个字符串,格式为XXXX_YYYY_YYYYYYY_YYYYYYZZZZ,如何从后面提取字符串,直到第三个_ (下划线) 出现。
提取的值为:YYYY_YYYYYYY_YYYYYYZZZZ
我尝试了这个正则表达式:((?:_[^_]*){3})$,它似乎可以处理开头多余的_,我可以在Java中去除它。
有没有办法在不使用开头的_的情况下获得提取的值呢?
5个回答

5

3

就像这样:

        String line = "XXXX_YYYY_YYYYYYY_YYYYYYZZZZ";

        Pattern p = Pattern.compile("([^_]+(?:_[^_]*){2})$");
        Matcher m = p.matcher(line);
        if(m.find()) {
            System.out.println(m.group(1));
        }

将你的“三倍”{3}分成一个不需要下划线的实例和两个需要它的实例。


1
如果您先反转字符串,那么您可以使用非常简单的正则表达式(.*)(_.*)来进行操作。
String input = "XXXX_YYYY_YYYYYYY_YYYYYYZZZZ";
input = new StringBuilder(input).reverse().toString().replaceAll("(.*)(_.*)", "$1");
input = new StringBuilder(input).reverse().toString();
System.out.println(input);

输出:

YYYY_YYYYYYY_YYYYYYZZZZ

1
一种非正则表达式的方法也是可行的:

String s = "XXXX_YYYY_YYYYYYY_YYYYYYZZZZ";
List r = Arrays.asList(s.split("_"));       // Split by _ and get a List
r = r.subList(Math.max(r.size() - 3, 0), r.size()); // Grab last 3 elements
System.out.println(String.join("_", r));    // Join them with _
// => YYYY_YYYYYYY_YYYYYYZZZZ

请查看IDEONE演示

如果分割后少于3个元素,则仅连接剩余的元素(即XX_YYY将变成XX_YYY)。


0
针对性能问题,最好使用正则表达式而不是字符串分割。Jan的答案就是你需要的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接