最新更新:这似乎是匹配器的问题,而不是表达式本身。我测试了一点,并在输入字符串上使用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);
}
答案 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)
这将使它原本将其视为文字形式。
感谢大家的帮助,我想我的问题误导了我没有意识到这么小的事情(事情并非总是如此!?)