这取决于模式需要的灵活性(它需要支持多少种不同的输入变化),但对于正则表达式模式来说,这样的事情将是一个好的开始:
(?<=^\s*SELECT\s+TOP\s+)\d+
您需要指定模式匹配不区分大小写,以便匹配以下任何一项:
SELECT TOP 50
SELECT top 50
select top 50
... etc.
另外,如果输入字符串包含多个 SQL 语句,您需要指定多行选项,以便 ^ 匹配每行的开头而不是字符串的开头。
这是一个完整的例子:
Dim input As String = _
"SELECT top 1000 First_name, Last_name FROM PERS_DAT" & Environment.NewLine &
"SELECT top 50 First_name, Middle_name, Last_Name FROM PERS_DAT" & Environment.NewLine &
"SELECT top 105 Last_name FROM PERS_DAT"
Dim pattern As String = "(?<=^\s*SELECT\s+TOP\s+)\d+"
For Each m As Match In RegEx.Matches(input, pattern, RegexOptions.IgnoreCase Or RegexOptions. Multiline)
Console.WriteLine(m.Value)
Next
正则表达式模式使用后视(即(?<=))语句来指定必须进行任何有效匹配的文本。输入字符串中唯一被捕获为匹配值的部分是\d+ 部分(即数字)。其他一切都只是说数字必须以新行开头,后跟单词“select”和“top”,由任意数量的空白字符分隔。
更新 1
根据您在下面的 cmets,下面是一个示例,说明如何使用 Regex.Replace 将数字替换为不同的值:
Dim input As String = "SELECT top 1000 First_name, Last_name FROM PERS_DAT"
Dim pattern As String = "(?<=^\s*SELECT\s+TOP\s+)\d+"
Dim output As String = Regex.Replace(input, pattern, Function(x) (Integer.Parse(x.Value) * 10).ToString(), RegexOptions.IgnoreCase)
在上面的示例中,我为 MatchEvaluator 参数传递了一个 lambda 表达式。 lambda 将匹配的数字转换为Integer,将其乘以10,然后将结果转换为字符串并将其作为替换值返回。因此,通过提供该 lambda 表达式,它将导致它用 SELECT top 10000 替换 SELECT top 1000。
更新 2
作为一个更复杂的例子,如果你创建了一个这样的方法:
Private Function CapAt350(m As Match) As String
If Integer.Parse(m.Value) < 350 Then
Return m.Value
Else
Return "350"
End If
End Function
然后你可以像这样使用它作为你的匹配评估器:
Dim input As String = "SELECT top 1000 First_name, Last_name FROM PERS_DAT"
Dim pattern As String = "(?<=^\s*SELECT\s+TOP\s+)\d+"
Dim output As String = Regex.Replace(input, pattern, AddressOf CapAt350, RegexOptions.IgnoreCase)