我需要提取字符串">数据";从这个容器串"><%=@my_secrets['data']%>";使用java正则表达式。下面的另一个例子
String input = "<%= @my_secrets['/abc/PQ-XYZ/1234/'] %>";
String expectedOutut = "/abc/PQ-XYZ/1234/";
有人能建议我如何使用单个正则表达式匹配器来实现这一点吗。
在提取之前,我还需要确保容器String的格式是"><%=@my_secrets["此处显示一些数据"]%>";然后仅提取。谢谢
假设您确信可以将输入文本与问题中的起始字符串隔离,则可以使用正则表达式String#replaceAll
的一行方法:
String input = "<%= @my_secrets['/abc/PQ-XYZ/1234/'] %>";
if (input.matches("<%= @my_secrets\['.*'\] %>")) {
String output = input.replaceAll(".*'(.*?)'.*", "$1");
System.out.println(output); // /abc/PQ-XYZ/1234/
}
else {
System.out.println("input does not match required format");
}
如果您关心性能:请记住,matches和replaceAll是regex的,因此在逐个调用的情况下
input.matches
然后
input.replaceAll
您正在进行至少两次编译
Pattern.compile(regex)
所以-编译一次-然后使用
static final Pattern p = Pattern.compile("<%= @my_secrets\['(.*)'\] %>");
public static void main(String[] args) {
String input = "<%= @my_secrets['/abc/PQ-XYZ/1234/'] %>";
Matcher matcher = p.matcher(input);
if (matcher.find()) {
//System.out.println(matcher.group());
System.out.println(matcher.replaceFirst("$1"));
}
}
小心。*-懒惰陷阱-它也会杀死你的应用程序/服务器
String cleaned = input.replaceAll(".*?'([^']+).*", "$1");
应该这样做