0

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

2 回答 2

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>
于 2013-07-12T17:09:33.053 回答
0

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

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

Pattern.quote(original)

这将使其本质上将原件视为其字面形式。

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

于 2013-08-09T14:40:54.643 回答