正则表达式以相反的顺序提取文本,直到字符的第3个实例

时间:2015-12-18 08:56:24

标签: java regex

我有一个格式为XXXX_YYYY_YYYYYYY_YYYYYYZZZZ

的字符串

如何从后向提取字符串,直到击中第三个_(下划线)。 提取值:YYYY_YYYYYYY_YYYYYYZZZZ

我尝试了这个((?:_[^_]*){3})$,它似乎在开头使用额外的_,我可以用Java删除它。

我有什么方法可以在开始时使用_

5 个答案:

答案 0 :(得分:5)

这个应该符合您的需求:

[^_]+(?:_[^_]+){2}$

Regular expression visualization

Debuggex Demo

答案 1 :(得分: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}分成一个没有_的实例和两个需要它的实例。

答案 2 :(得分: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

答案 3 :(得分: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 demo

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

答案 4 :(得分:0)

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