【问题标题】:regex . (dot) does not catch parenthesis in strings?正则表达式。 (点)不捕捉字符串中的括号?
【发布时间】:2013-07-11 07:21:20
【问题描述】:

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

【问题讨论】:

  • ? 到底应该做什么?哦,这个表达式还选取标签名称以“a”开头的元素,例如&lt;area&gt;&lt;abbr&gt;&lt;acronym&gt; 等。另外,this.
  • 我是正则表达式的新手,?被解释为前一个表达式的 0 或 1,我只是把它放在那里,因为我见过 .*?作为一种“包罗万象”。我并没有真正考虑过其他标签,所以谢谢,但现在我只是想了解为什么 () 搞砸了。

标签: java html regex hyperlink anchor


【解决方案1】:

如果不查看您正在使用的 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>

【讨论】:

  • 感谢您的快速回答。我将在原帖中添加更多细节,也许有助于澄清一些事情。
  • 我删除了 的转义字符,一切仍然以相同的方式工作(..不知道为什么我认为他们需要它们。)所以我的表达应该工作......我真的有不知道为什么不是。它也适用于regexplanet.com/advanced/java/index.html..
  • @user2395495 你确定它不匹配吗?错误可能在htmlToWiki 的其他地方吗?
  • 是的,我把它剪到那个部分,然后再试一次。当锚标记之间的字符串有 () 时,它甚至不会添加到列表中。
【解决方案2】:

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

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

Pattern.quote(original)

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    相关资源
    最近更新 更多