2017-02-12 69 views
0

我試圖從VBAVB.NET遷移一個正則表達式(實用程序)的庫,因爲(我的總體印象是)它提供了更多支持獲得「乾淨」和可重複使用的代碼(包括Regex支持)。VBA到VB.NET - 正則表達式 - System.Text.RegularExpressions - 沒有全局修飾符

庫是一個factory pattern重用compiled正則表達式(用於性能優化目的;不確定選項RegexOptions.Compiled可以幫助它)。它與一個Lib組合使用,它保存模式記錄(實用程序)並返回一個對象;其中除pattern還包括modifiers(作爲屬性)。

然而,System.Text.RegularExpressionsRegEx對象沒有一個乾淨的系統指定flags/modifiers ......

' VBA 
Dim oRegExp As New RegExp 
With oRegExp 
    .Pattern = Pattern 
    .IgnoreCase = IgnoreCase 
    .Multiline = Multiline 
    .Global = MatchGlobal 
End With 

對戰

' VB.NET 
Dim opts As RegexOptions = New RegexOptions 

If IgnoreCase Then opts = opts Or RegexOptions.IgnoreCase 
If Multiline Then opts = opts Or RegexOptions.Multiline 

Dim oRegExp As RegEx 
oRegExp = New RegEx(Pattern, opts) 

'Were can I specify MatchGlobal??? 

正如我不認爲這是一個不對這部分代碼的改進,我將依靠應用inline modifiers代替(these here)(直接嵌入到Pattern本身),並擺脫包含修飾符作爲屬性(未包括在示例中)的模式庫的對象。

這樣...

' This -> "\bpre([^\r\n]+)\b" 
' in .NET, can be this -> "\bpre(?<word>\w*)\b" 
' as .NET supports named groups 

Dim Pattern as String = "(?i)\bpre(?<word>\w*)\b" ' case insensitive 

唯一問題是,作爲上述VB.NET例子所示,命名空間System.Text.RegularExpressionsRegEx對象似乎不讓你改變全球匹配修飾符(和inline modifiers,邏輯上,不包括global match flag)。

有關如何處理它的任何想法?

+0

只是假設'MatchGlobal'永遠是真的 - 'System.Text。RegularExpressions'沒有限制結果集到第一個匹配的概念。只需使用第一場比賽即可。 – Comintern

+0

@Comintern:謝謝你的回答。好吧,我看到了......但是,這似乎並不是一個最佳的解決方案......因爲它每次都會獲取所有找到的記錄,即使您剛需要第一場比賽時也是如此 – rellampec

+0

然後,只需編寫您的快遞單以便匹配第一個例子 - 即以一行起始行錨'^'。 – Comintern

回答

1

不支持global正則表達式選項由於此行爲通過兩種不同的方法實現。

爲了僅獲得第一(一個)匹配使用Regex.Match

搜索在Regex構造函數中指定正則表達式的第一次出現指定的輸入字符串。

要匹配所有實例,使用Regex.Matches

中搜索一個正則表達式的所有匹配的輸入字符串,並返回所有匹配。

您需要實現的邏輯:如果所有比賽都預計,引發Regex.Matches,如果只有一個,用Regex.Match

+0

好吧,這是有道理的(就實施而言)......儘管我仍不明白他們爲什麼沒有遵循關於全局修飾符的正則表達式規範。謝謝你的回答Wiktor。 – rellampec