我試圖從VBA
到VB.NET
遷移一個正則表達式(實用程序)的庫,因爲(我的總體印象是)它提供了更多支持獲得「乾淨」和可重複使用的代碼(包括Regex支持)。VBA到VB.NET - 正則表達式 - System.Text.RegularExpressions - 沒有全局修飾符
庫是一個factory pattern
重用compiled
正則表達式(用於性能優化目的;不確定選項RegexOptions.Compiled
可以幫助它)。它與一個Lib
組合使用,它保存模式記錄(實用程序)並返回一個對象;其中除pattern
還包括modifiers
(作爲屬性)。
然而,System.Text.RegularExpressions
的RegEx
對象沒有一個乾淨的系統指定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.RegularExpressions
的RegEx
對象似乎不讓你改變全球匹配修飾符(和inline modifiers
,邏輯上,不包括global match flag
)。
有關如何處理它的任何想法?
只是假設'MatchGlobal'永遠是真的 - 'System.Text。RegularExpressions'沒有限制結果集到第一個匹配的概念。只需使用第一場比賽即可。 – Comintern
@Comintern:謝謝你的回答。好吧,我看到了......但是,這似乎並不是一個最佳的解決方案......因爲它每次都會獲取所有找到的記錄,即使您剛需要第一場比賽時也是如此 – rellampec
然後,只需編寫您的快遞單以便匹配第一個例子 - 即以一行起始行錨'^'。 – Comintern