2013-07-12 42 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'中的其他地方? –

相關問題