2013-12-13 34 views
0

我想寫一個正則表達式,將匹配中的文本字符串,可能是URL的HTML編碼。儘管如此,我仍然有相當多的麻煩。我需要的東西,可以正確下面的字符串匹配中的兩個鏈接:匹配的URL字符串內

some text "http://www.notarealwebsite.com/?q=asdf&searchOrder=1" "http://www.notarealwebsite.com" some other text 

什麼,我想會是一個詳細的描述:「HTTP://」後面的任意數目的不空格,引號字符,或字符串「& QUOT [分號]」(我不在乎接受其他非URL安全字符作爲分隔符)

我一直在使用先行檢查&的再用q的跟着嘗試了幾個正則表達式通過將U等,但只要我把一進[^ ...]否定它只是完全分解和評估更像是:「HTTP://後跟任意數量的不空格,引號字符,符號s,q's,u's,o's,t's或者分號「,這顯然不是我正在尋找的。

這將正確地在& QUOT [分號]的開始匹配&的:

&(?=q(?=u(?=o(?=t(?=;))))) 

但是,這並不工作:

http://[^ "&(?=q(?=u(?=o(?=t(?=;)))))]* 

我知道正則表達式來剛夠惹上麻煩,包括不知道爲什麼這不會按照我想要的方式工作。我在某種程度上瞭解正面和負面的看法,但我不明白爲什麼它在[^ ...]內部崩潰。用正則表達式可以做到這一點嗎?或者我是否浪費時間努力使其工作?

+1

方括號內的內容只能匹配單個字符,例如[a-zA-z]與該組的_one_字符匹配。你可以用^來否定一個組,對。這將匹配沒有被該組描述的任何字符。但是你不能否定其他任何東西,比如整個表達。 – fpw

+0

&(?= q(?= u(?= o(?= t(?=;)))))只匹配單個字符,所以我希望它能夠工作,即使理解只有方括號做一個人物。方括號內的表達式是否會被評估?就像,從字面上看,它只是單獨看每個角色,甚至不會注意到它們形成了一個表達式? – Dave

+1

對,括號實際上只能包含字符的枚舉,^和 - 只是語法糖,所以你不必爲[a-z]寫[abcdef ...]。所以你的表達式不會被評估,它只是匹配任何不是^之後提到的字符的東西。 – fpw

回答

1

如果您的正則表達式實現支持它,請在正文中使用積極的向前看和帶有非貪婪表達式的反向引用。

這是一個與你的條件:(["\s]|")(http://.*?)(?=\1)

例如,在Python:

import re 
p = re.compile(r'(["\s]|")(https?://.*?)(?=\1)', re.IGNORECASE) 
url = "http://test.url/here.php?var1=val&var2=val2" 
formatstr = 'text "{0}" more text {0} and more "{0}" test greed"' 
data = formatstr.format(url)  
for m in p.finditer(data): 
    print "Found:", m.group(2) 

產地:

Found: http://test.url/here.php?var1=val&var2=val2 
Found: http://test.url/here.php?var1=val&var2=val2 
Found: http://test.url/here.php?var1=val&var2=val2 

或者在Java中:

@Test 
public void testRegex() { 
    Pattern p = Pattern.compile("([\"\\s]|")(https?://.*?)(?=\\1)", 
     Pattern.CASE_INSENSITIVE); 
    final String URL = "http://test.url/here.php?var1=val&var2=val2"; 
    final String INPUT = "some text " + URL + " more text + \"" + URL + 
      "\" more then "" + URL + "" testing greed ""; 

    Matcher m = p.matcher(INPUT); 
    while(m.find()) { 
     System.out.println("Found: " + m.group(2)); 
    } 
} 

P導致相同的輸出。

+0

這實際上是一個好主意,而且我確實設法在我的應用程序中適應了完全不同的用途。這就是說,我似乎無法讓它爲我的原始問題工作。當我在Java應用程序中運行它時,匹配的字符串正確遺漏任何下列分隔,但他們也錯誤地包含任何領頭的人。添加空格作爲分隔符時,我也無法使其正常工作。 – Dave

+1

我更新的例子有Java版本,並加入你的空間封閉的情況下。如果您使用匹配組2,它會給出正確的結果(不帶前導分隔符)。如果這對你有用,請接受答案。 –

+0

謝謝傑克!獎勵點提醒我,我也需要處理https。 – Dave