2011-12-18 42 views
0

我有在F#中的正則表達式的另一個問題:F#正則表達式字符串模式的變化意味着

let tagName = "div" 
let ptnTagNotClose = "<" + tagName + "(>|\s+[^>]*>)[^<]" 

我想找到匹配在HTML文件中未關閉標籤。模式字符串在VB.NET中起作用。 但對於F#,當我調試上面的代碼中,我可以看到ptnTagNotClose值:

ptnTagNotClose "<div(>|\\s+[^>]*>)[^<]" 

F#自動變爲 「\ S +」 到 「\\ S +」,但對正則表達式, 「\ S +」和「\\ s +」是不同的,結果也不同。 請讓我知道如何避免F#自動更改字符串模式。

逐字字符串文字可能是一個解決方案,但由於tagName可以更改,即讓tagName =「br」,那麼在這種情況下如何應用逐字字符串文字呢?

謝謝!

約翰

+2

此時我不得不指出它通常被認爲是一個非常糟糕的主意(http://stackoverflow.com/a/1732454/24380)用正則表達式解析HTML或XML。 – 2011-12-18 18:16:16

+0

「tagName」可以改變的事實與逐字字符串文字有什麼關係?這些都是完全正交的問題... – ildjarn 2011-12-19 19:02:38

+0

嗨,據我所知,使用正則表達式,人們可以從HTML中提取一些有用的信息。對於格式良好的XML,不需要使用正則表達式,因爲有足夠的工具可以獲取有用的信息。我知道通過正則表達式從HTML獲取所有信息並不容易。但只要我能夠獲得運行其他部分程序所需的信息,我認爲就足夠了! – 2011-12-19 21:17:04

回答

2

我不認爲調試輸出意味着你認爲它的作用;使用逐字字符串(如"<" + tagName + @"(>|\s+[^>]*>)[^<]")將給出完全相同的結果,因爲\s不是有效的轉義序列,所以F#將反斜槓解釋爲文字反斜槓而不是轉義字符。

+0

嗨,KVB:我發現這個問題:在VS2010 IDE中,模式的調試結果是錯誤的,但是從F#交互式來看,模式的結果是正確的。但似乎VB.NET和F#的字符串/正則表達式有很多不同之處;因此,正確的VB.NET不能在F#中重現。 – 2011-12-19 21:13:59

+0

嗨, 我仍然認爲F#中的正則表達式與VB.NET中的正則表達式不同。 如果有人可以嘗試在F#中使用正則表達式來提取HTML文件中的某些表格元素,您將理解它。但在VB.NET中使用正則表達式通常是可行的! – 2012-01-29 10:58:16

相關問題