2013-07-12 43 views
0

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

什么是'?'应该做的是什么呢?噢,这个表达式还会提取标签名称以“a”开头的元素,例如'','',''等等。另外,[this](http://stackoverflow.com/a/1732454/1016716)。 –

+0

我是新来的正则表达式?被解释为我之前表达的0或1,我只是把它放在那里,因为我看到了。*?作为一种“全部抓住”。我真的没有想过那些其他标签,所以谢谢,但现在我只是想明白为什么()会搞砸了。 – Pewsplosions

回答

0

大量的测试后这样我想通了,我的模式和匹配是不是probem毕竟。我的代码的问题是,在最后一次replaceAll方法中,原始文件是另一个REGEX模式,而不是文字。所以它找到了元字符,并没有做到我所期望的。

如果你正在尝试类似的事情,当你去做最后的replaceAll围绕你的原始变量与Pattern.quote()。

Pattern.quote(original) 

这将使它将原始的字面形式视为本质。

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

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> 
+0

感谢您的快速回答。我会在原文中增加更多细节,也许有助于澄清一些事情。 – Pewsplosions

+0

我删除了< and >的转义字符,一切仍然以同样的方式工作(..不知道为什么我认为他们需要他们。)所以我的表情应该工作...我真的不知道为什么它不是。它的工作也http://www.regexplanet.com/advanced/java/index.html .. – Pewsplosions

+0

@ user2395495你是积极的,它不匹配?错误可能在'htmlToWiki'中的其他地方? –

相关问题