【发布时间】:2013-04-03 15:36:54
【问题描述】:
我有这样的模式:<[a-zA-Z][^>]*(?:poster|src)=(['\"])([^'\"]+)\\1[^>]*>
这里我想替换 src 或 poster 属性的值。
没关系
<video src='srcVal' />
和
<video poster='posterVal' src='srcVal' />
但对于
<video poster='posterVal' src='srcVal' />
仅更改 src 值,因为 matcher.group(2) 仅返回 srcVal。
public class Test {
public static void main(String[] args) throws Exception {
String html = "<video poster='posterVal' src='srcVal' />";
Pattern resourcePattern = Pattern.compile("<[a-zA-Z][^>]*(?:poster|src)=(['\"])([^'\"]+)\\1[^>]*>");
Matcher matcher = resourcePattern.matcher(html);
int last = 0;
StringBuilder sb = new StringBuilder();
while(matcher.find()) {
String path = matcher.group(2) + "Changed";
sb.append( html.substring(last, matcher.start(2)) + path );
last = matcher.end(2);
}
sb.append(html.substring(last));
System.out.println(sb);
//outputs <video poster='posterVal' src='srcValChanged' />
//expecting <video poster='posterValChanged' src='srcValChanged' />
}
}
有没有人知道如何做到这一点?
【问题讨论】:
-
试试看这里:Java Regex
-
当您关心语言的结构而不是文本的精确表示时,我不建议您使用正则表达式。也就是说,您正在解析 XML 方言,并且在 XML 中属性的顺序无关紧要 - 但正则表达式不能轻易表示“顺序无关紧要”。使用真正的XML库,有很多选择。
-
他们不容易,但他们仍然可以。前瞻和条件正则表达式是可用于实现此类目标的 2 个工具。
-
我接受@drquicksilver 的建议。我将使用 xml 解析器和 xpath 来更改值。因此,单一模式不可能发生这样的事情。就像刚琴老胡推荐的教程一样,多用一种模式就可以实现。