Dot-Net
代理對檢測失敗
我正在從事 F# 中的一個小型項目,該項目涉及將現有 C# 程式碼移植到 F#,我似乎遇到了兩種語言之間處理正則表達式的方式的差異(我發布這個希望發現我是只是做錯了什麼)。
這個次要函式使用此處概述的正則表達式技巧簡單地檢測代理對。這是目前的實現:
let isSurrogatePair input = Regex.IsMatch(input, "[\uD800-\uDBFF][\uDC00-\uDFFF]")如果我然後對一個已知的代理對執行它,如下所示:
let result = isSurrogatePair "𠮷野𠮷" printfn "%b" result我進入
falseFSI 視窗。如果我使用等效的 C#:
public bool IsSurrogatePair(string input) { return Regex.IsMatch(input, "[\uD800-\uDBFF][\uDC00-\uDFFF]"); }和相同的輸入值,我(正確地)
true返回。這是一個真實的問題嗎?我只是在我的 F# 實現中做錯了嗎?
F# 如何對轉義的 Unicode 字元進行編碼似乎存在錯誤。
以下來自 F# Interactive(注意最後兩個結果):
> "\uD500".[0] |> uint16 ;; val it : uint16 = 54528us > "\uD700".[0] |> uint16 ;; val it : uint16 = 55040us > "\uD800".[0] |> uint16 ;; val it : uint16 = 65533us > "\uD900".[0] |> uint16 ;; val it : uint16 = 65533us幸運的是,這種解決方法有效:
> let s = new System.String( [| char 0xD800 |] ) s.[0] |> uint16 ;; val s : System.String = "�" val it : uint16 = 55296us基於這一發現,我可以建構一個更正(或者更確切地說,變通方法)的版本
isSurrogatePair:let isSurrogatePair input = let chrToStr code = new System.String( [| char code |] ) let regex = "[" + (chrToStr 0xD800) + "-" + (chrToStr 0xDBFF) + "][" + (chrToStr 0xDC00) + "-" + (chrToStr 0xDFFF) + "]" Regex.IsMatch(input, regex)此版本正確返回
true您的輸入。我剛剛在 GitHub 上送出了這個問題:https ://github.com/Microsoft/visualfsharp/issues/338