2011-12-17 5 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ではOKです。私のコードは正しく動作します。 F#コードを修正する方法を教えてください。そうすれば動作します。

答えて

3

"をとして、hereのようにエスケープするだけで、VB.NETのエスケープ(2倍にする)の代わりに使用できます。

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

より良いオプションがリテラル逐語的文字列に変更するかもしれませんけど。

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

こんにちは、オデッド: は私のコードはコンパイルされ、どうもありがとうございましたが、予想通り、完全に機能しません。 私のVB.NETのバージョンは同じデータで正しく動作しますが、F#のバージョンはいくつかの異なる結果を返しますが、これは正しくありません。 このコードは、あるWebページのURL、VB.NETバージョン、FirefoxのWeb Developer(inspect)から同じURLを取得するのに使用されますが、F#バージョンの結果、返されたすべてのURLが先頭の部分を欠いているようです。 –

+0

@JohnJohn - 更新された答え。逐語文字列リテラルを使用します。 – Oded

+0

こんにちは、Oded: 私はテストした結果は同じです。 なぜVB.NETが動作するのか理解できませんが、F#は同じ仕事をしていません。 あなたの親切な助けをありがとう! John –

関連する問題