2009-02-28 73 views
0

我有一些nemerle代碼如下方法:語法錯誤匹配鏈接的URL

private static getLinks(text : string) : array[string] { 
     def linkrx = Regex(@"<a\shref=['|\"](.*?)['|\"].*?>"); 
     def m = linkrx.Matches(text); 
     mutable txmatches : array[string]; 
     for (mutable i = 0; i < m.Count; ++i) { 
      txmatches[i] = m[i].Value; 
     } 
     txmatches 
    } 

問題是,編譯器因某種原因被試圖解析正則表達式語句及其括號內導致程序不能編譯。如果我刪除了@,(我被告知要放在那裏)我得到一個無效的轉義字符錯誤的「\ S」

繼承人的編譯器輸出:

NCrawler.n:23:21:23:22: ←[01;31merror←[0m: when parsing this `(' brace group 
NCrawler.n:23:38:23:39: ←[01;31merror←[0m: unexpected closing bracket `]' 
NCrawler.n:22:57:22:58: ←[01;31merror←[0m: when parsing this `{' brace group 
NCrawler.n:23:38:23:39: ←[01;31merror←[0m: unexpected closing bracket `]' 
NCrawler.n:8:1:8:2: ←[01;31merror←[0m: when parsing this `{' brace group 
NCrawler.n:23:38:23:39: ←[01;31merror←[0m: unexpected closing bracket `]' 
NCrawler.n:23:38:23:39: ←[01;31merror←[0m: unexpected closing bracket `]' 

(第23行是行與正則表達式代碼就可以了)

我該怎麼辦?

回答

3

我不知道Nemerle,但它似乎使用@禁用所有轉義,包括"轉義。

嘗試其中之一:

def linkrx = Regex("<a\\shref=['\"](.*?)['\"].*?>"); 

def linkrx = Regex(@"<a\shref=['""](.*?)['""].*?>"); 

def linkrx = Regex(@"<a\shref=['\x22](.*?)['\x22].*?>"); 
+0

只是爲了記錄在案,該功能被稱爲「逐字字符串文字「。 – CMS 2009-02-28 06:44:13

1

的問題是帶引號,沒有括號。在Nemerle中,與C#中一樣,用另一個引號將引號標出,而不是反斜槓。

@"<a\shref=['""](.*?)['""].*?>" 

編輯:請注意,你不需要在方括號內的管道;內容被視爲一組字符(或字符範圍),其中隱含有OR。

2

我不是Nemerle程序員,但我知道你應該總是使用XML解析器來處理基於XML的數據,而不是正則表達式。

我猜有人建立DOM或XPath庫Nemerle這樣你就可以訪問任何

//一個[@href]通過XPath或類似的東西通過DOM a.href.value。

那當前的正則表達式不喜歡例如

<a class="foo" href="something">bar</a> 

我沒有測試這一點,但它應該是更喜歡它

/<a\s.+?href=['|\"]([^'\">]+)['|\"].+?>/i 
+0

OP是否說他正在解析XML?我所看到的只是他將一個正則表達式應用於一些看起來像HTML定位標記的字符串。至於在'href'之前可能存在的其他屬性,我會假設他知道這不會發生;畢竟,這是他的數據。 – 2009-02-28 06:49:57