使用Java正则表达式:从另一个字符串中提取一部分文本



我需要提取字符串">数据";从这个容器串"><%=@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");

应该这样做

最新更新