0

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

4

3 回答 3

0

来,试一试。换这个...

(?<=href=)(['"]?)\\$([^$>]+)\\$

...有了这个:

$1$url

并且不要忘记逃避你的反斜杠。

于 2012-10-24T20:44:00.443 回答
0

如果我正确理解了您的问题,则您正在尝试以$someIdentifier$您使用 someIdentifier 取消引用的应用程序中的某些值的形式替换模式。

您似乎想要使用该模式\$([^\$]+)\$并查找字符串中的每个匹配项,获取第一组 (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);
   }
于 2012-10-24T20:46:24.730 回答
0

好吧..我试过你的正则表达式并没有得到错误。但是,正则表达式直到元素末尾才替换$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);
}
于 2012-10-24T20:48:10.763 回答