最新更新:这似乎是匹配器的问题,而不是表达式本身。我测试了一下,并在输入字符串上使用Pattern/Matcher导致了这个问题。具有元字符的输入字符串会导致匹配器跳过匹配。如果我只是使用一个简单的.replaceAll具有相同的表达式,它会发现它很好。我试图对输入字符串使用Pattern.quote,但没有改变任何东西。所以我仍然坚持。为什么匹配器在输入字符串中存在元字符时找不到匹配项?有没有办法让输入字符串忽略关于匹配器的元字符?正则表达式。 (点)不会在字符串中捕捉括号?
我想对大字符串做一个正则表达式来从标签的开始到结束标签提取所有html链接。我想出了这个表达式:
<a.*?</a>
这样做的确不错。它几乎获得了所有这些。我的问题是,如果在字符串内有括号:
<a href="blahblah">myproblem()</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);
}
什么是'?'应该做的是什么呢?噢,这个表达式还会提取标签名称以“a”开头的元素,例如'','',''等等。另外,[this](http://stackoverflow.com/a/1732454/1016716)。 –
我是新来的正则表达式?被解释为我之前表达的0或1,我只是把它放在那里,因为我看到了。*?作为一种“全部抓住”。我真的没有想过那些其他标签,所以谢谢,但现在我只是想明白为什么()会搞砸了。 – Pewsplosions