我有以下正则表达式片段来解析ahref的URL,如下所示:
(?<=href=)[^\"']+(?=(\"|'))?>
我想要做的是用数据替换下面的代码片段,我在运行时填充:
<a href=$tracking_url$&langding_url=google.com>
<img src="irreleavnt" />
</a>
当我按如下方式尝试replaceAll()时,它会失败
String fragment = <a href=$click_tracking_url$&landing_url=google.com><img src=\"10.gif\" /></a>
String processedFragment = fragment.replaceAll(AHREF_REGEX, ahrefurl);
错误是:
java.lang.IllegalArgumentException: Illegal group reference
at java.util.regex.Matcher.appendReplacement(Matcher.java:724)
at java.util.regex.Matcher.replaceAll(Matcher.java:824)
at java.lang.String.replaceAll(String.java:1572)
如何修复正则表达式以匹配<a href=$click_tracking_url$
?我怎样才能从正则表达式中逃脱$
?
答案 0 :(得分:0)
在这里,试一试。替换这个......
(?<=href=)(['"]?)\\$([^$>]+)\\$
......用这个:
$1$url
不要忘记逃避你的反斜杠。
答案 1 :(得分:0)
如果我正确理解了您的问题,那么您尝试将$someIdentifier$
形式的模式替换为您正在使用someIdentifier取消引用的应用程序中的某些值。
似乎你想要使用模式\$([^\$]+)\$
并找到字符串中的每个匹配项,获取组one(1)的值,查找该值,然后将所有出现的特定序列替换为你抬头看的价值。
String someString = "some$string$withatoken";
Pattern tokenPattern = Pattern.compile("\\$([^\\$]+)\\$");
Matcher tokenMatcher = tokenPattern.matcher(someString);
// find not matches. matches will compare the entire string against the pattern
// basically enforcing ^{pattern}$.
while (tokenMatcher.find()) {
String tokenName = tokenMatch.group(1);
String tokenValue = tokenMap.get(tokenName); // lookup value of token name.
someString = someString.replaceAll("\\$" + tokenName + "\\$", tokenValue);
// resets the target of the matcher with the new value of someString.
tokenMatcher.reset(someString);
}
答案 2 :(得分:0)
嗯..我试过你的正则表达式并没有得到错误。但是,regexp并没有替换$click_tracking_url$
,而是将整个文本替换为元素的结尾。
如果您需要动态替换占位符,请尝试以下操作:
Map<String, String> placeholders = new HashMap<String, String>();
// init your placeholders somehow...
placeholders.put("click_tracking_url", "something");
String fragment = "<a href=\"$click_tracking_url$&landing_url=google.com\"><img src=\"10.gif\" /></a>";
Matcher m = Pattern.compile("\\$(\\w+)\\$").matcher(fragment);
if (m.find()) {
String processedFragment = m.replaceAll(placeholders.get(m.group(1)));
System.out.println(processedFragment);
}