我有一个格式为XXXX_YYYY_YYYYYYY_YYYYYYZZZZ
如何从后向提取字符串,直到击中第三个_
(下划线)。
提取值:YYYY_YYYYYYY_YYYYYYZZZZ
我尝试了这个((?:_[^_]*){3})$
,它似乎在开头使用额外的_
,我可以用Java删除它。
我有什么方法可以在开始时使用_
。
答案 0 :(得分:5)
答案 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的答案就是你所需要的。