由于$,Java正则表达式与错误匹配

时间:2012-10-24 20:29:27

标签: java regex

我有以下正则表达式片段来解析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$?我怎样才能从正则表达式中逃脱$

3 个答案:

答案 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);
}