最新更新:这似乎是匹配器的问题,而不是表达式本身。我对其进行了更多测试,并且在输入字符串上使用 Pattern/Matcher 会导致问题。具有元字符的输入字符串导致匹配器跳过匹配。如果我只是使用具有相同表达式的简单 .replaceAll ,它会发现它很好。我尝试在输入字符串上使用 Pattern.quote 但没有改变任何东西。所以我还是卡住了。如果输入字符串中存在元字符,为什么匹配器找不到匹配项?有没有办法让输入字符串忽略匹配器的元字符?
我正在尝试对大字符串执行正则表达式,以提取从标记开头到结束标记的所有 html 链接。我想出了这个表达:
<a.*?</a>
这做得很好。它几乎得到了所有这些。我的问题是字符串内是否有括号,例如:
<a href="blahblah">myproblem()</a>
匹配器完全跳过此链接。我以为 .*? 会拾取从第一个 a 之后的空格到结束 a 标签的左括号的所有内容,但如果有任何括号则不会。
我在这里想念什么?
编辑澄清:
我正在使用java。在添加到我的项目之前,这是我正在做的测试。当我运行它时它失败了,但是如果我在测试中取出 () ,它就会通过。使用 () 我很确定它甚至没有被添加到列表中:
String tryConvert = doclet.htmlToWiki("<a href=\"#test.method\">test()</a>");
assertThat(tryConvert, is("[test()|test#method]"));
和 htmlToWiki 代码:
ArrayList<String> links = new ArrayList<String>();
Pattern linkPattern = Pattern.compile("<a.*?</a>", Pattern.DOTALL);
Matcher matcher = linkPattern.matcher(html);
while (matcher.find())
{
links.add(matcher.group());
}
for (String link : links)
{
String original = link;
String alias = link.replaceAll("<a.*?>", "");
alias = alias.replaceAll("</a>", "");
link = link.replaceAll("\">.*?</a>", "]");
link = link.replaceAll("<a.*#", "[");
link = link.replaceAll("\\.", "#");
link = link.replace("[", "[" + alias + "|");
html = html.replaceAll(original, link);
}