2011-12-17 50 views
0

我想將正則表達式的一些VB.NET代碼轉換爲F#。 下面的代碼工作在VB.NET:移植一些VB.NET代碼時的F#問題

Dim regOpts As RegexOptions = RegexOptions.IgnoreCase Or RegexOptions.Singleline 
Dim r As New Regex("<a[^>]*href\s*=\s*""?(?<HRef>[^"">\s]*)""?[^>]*>", regOpts) 

但在F#相應的代碼不能得到遵守:

open System.Text.RegularExpressions 
let regOpts: RegexOptions = RegexOptions.IgnoreCase ||| RegexOptions.Singleline 
let reg = new Regex("<a[^>]*href\s*=\s*""?(?<HRef>[^"">\s]*)""?[^>]*>", regOpts) 

我得到了編譯器錯誤:

Error: This value is not a function and cannot be applied

我相信F#不能識別雙引號內的雙引號,但對於VB.NET來說,沒問題,我的代碼能夠正常工作。請告訴我如何修改F#代碼,以便它可以工作。

回答

3

只是逃避"\"here所述,而不是VB.NET轉義(使其加倍)。

let reg = new Regex("<a[^>]*href\s*=\s*\"?(?<HRef>[^\">\s]*)\"?[^>]*>", regOpts) 

雖然一個更好的選擇可能是將其更改爲一個逐字字符串:

let reg = new Regex(@"<a[^>]*href\s*=\s*""?(?<HRef>[^"">\s]*)""?[^>]*>", regOpts) 
+0

嗨,28:9 非常感謝你,我的代碼編譯,但預計不會完全正常工作。 我的VB.NET版本與相同的數據正常工作,但F#版本給出了一些不同的結果,這是不正確的。 該代碼用於列出一個網頁中的URL,VB.NET版本和Firefox的Web Developer(inspect)獲取相同的URL,但是從F#版本的結果來看,返回的所有URL似乎都缺少主要部分。 有什麼想法? – 2011-12-17 22:29:55

+0

@JohnJohn - 最新回答。使用逐字字符串文字。 – Oded 2011-12-17 22:33:36

+0

嗨,Oded: 我測試過了,結果是一樣的。 我不明白爲什麼VB.NET可以工作,但F#沒有做同樣的工作。 但是,感謝您的善意幫助! 約翰 – 2011-12-17 22:50:11