2011-05-25 57 views
1

我想創建一個.NET正則表達式,它將匹配VB.NET源代碼中的引用字符串,但排除某些不需要的字符串,如XML註釋和區域中的字符串標籤等正則表達式來匹配引用負面lookbehind字符串(.NET)

這裏有一個數據樣本,表示正則表達式可以執行對一些VB.NET代碼:

#Region "Class Constructors" 

''' <summary> 
''' Initializes a new instance of the <see cref="MyClass" /> class. 
''' </summary> 
Public Sub New() 
    Debug.WriteLine("This string should be matched by the Regex") 
End Sub 

#End Region 

正則表達式應該與Debug.WriteLine方法調用中引用的字符串,而是應該忽略字符串中的區域標籤和XML註釋。還應該支持VB.NET的報價逃逸語法使用兩個連續的雙引號表示嵌入(逃脫)引號字符:

"This is a string containing an escaped quote "" character" 

作爲一個起點,我有以下的正則表達式,但負回顧後試驗導致它匹配隨後的結束報價,就好像它們是開盤報價一樣。

(?<!Region\s+)"(?<Literal>(?:[^"]|"")*)" 

作爲附加的精細度,這將是有益的,如果正則表達式可以完全忽略由雙引號字符表示空字符串。

有什麼建議嗎?

由於提前, 添

回答

1

我覺得這是在一個單一的正則表達式不會解決你所有的問題的案件之一。我認爲#REGION指令可以是多行如:

#Region \ 
    "MyRegion" 

或可能與其他一些換行符,所以你的回顧後是不夠的。從具有複雜語法的文本中選擇性地提取匹配項需要詞法分析器,或者您應該以不同的方式解析整個事情。 你可能但是能夠找到一個快捷方式,例如,你知道,你不想要的標籤<總結>和< /總結>之間的任何東西,所以你可以通過每個線路迴路並跳過一切都會過去<總結>,直到你找到結束標記,然後您可以繼續匹配字符串。 你應該特別注意編寫一個正則表達式去除註釋和預處理指令(即:',#和REM)。請注意,如果這些關鍵字不在字符串中,則這些關鍵字都是有效的,因此剝離註釋有點涉及。即使在那裏,一個正則表達式可能還不夠。 對於雙引號下降,這似乎是對我來說:

"((?:[^"]|"")+)" 
+0

感謝您的回答。你說得對,這比我想象的更復雜,但你對

標籤的建議給了我一個有用的線索,我認爲我可以開展工作。我可以使用相同的技術來「匹配」我想要排除的所有字符串,但只捕獲包含我所需文字的案例。 – 2011-05-25 13:47:09

相關問題