正则表达式(点)不会在字符串中捕获括号?

时间:2013-07-12 16:59:01

标签: java html regex hyperlink anchor

最新更新:这似乎是匹配器的问题,而不是表达式本身。我测试了一点,并在输入字符串上使用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);
    }

2 个答案:

答案 0 :(得分:2)

如果没有看到您正在使用的JavaScript,很难确切地说出错误。也许有太多的转义字符(无论如何这里真的不需要)。这对我有用:

var input = 'foo <a href="blahblah">myproblem()</a> bar';
var match = input.match(/<a.*?<\/a>/);
alert(match[0]); // <a href="blahblah">myproblem()</a>

可替换地:

var input = 'foo <a href="blahblah">myproblem()</a> bar';
var match = RegExp('<a.*?</a>').exec(input);
alert(match[0]); // <a href="blahblah">myproblem()</a>

答案 1 :(得分:0)

经过大量测试后,我发现我的模式和匹配器毕竟不是探测器。我的代码的问题是,在最后一个replaceAll方法中,原始是另一个REGEX模式,而不是文字。所以它找到了元字符而不是我所期望的。

如果你正在尝试类似的东西,当你去做最后的replaceAll用Pattern.quote()包围原始变量。

Pattern.quote(original)

这将使它原本将其视为文字形式。

感谢大家的帮助,我想我的问题误导了我没有意识到这么小的事情(事情并非总是如此!?)