我的同事需要我为他的vb.net应用程序写一个正则表达式。
我不知道vb,他不知道正则表达式。
他需要的正则表达式是:
/.*web id: ?(\d+).*/i
基本上他需要在字符串中搜索“web id:345”或“web id:2534”之类的内容并检索ID。
他拿走了我上面给他的东西并且能够把它放在一起:
Dim strPattern As String = ".*web id: ?(\d+).*"
Dim strReplacement$ = "$1"
GetWebId$ = Regex.Replace(LCase$(strNote$), strPattern$, strReplacement$)
但是我不确定你是如何传递不区分大小写的标志的? (他目前的解决办法是将整个字符串放在第一位)
我似乎无法弄明白的一件事是,当他在一个包含多行的字符串上运行它时,任何与“web id:\ d”不在同一行的文本也会被返回,我发现奇怪。
答案 0 :(得分:3)
使用RegexOptions.IgnoreCase
标志:
Regex.Replace(strNote, strPattern, strReplacement, RegexOptions.IgnoreCase)
如果您要忽略大小写,则不需要使用LCase
。我还发现你的变量名中包含所有$
符号很奇怪 - 它们在C#或VB.NET中都不应该有效。
$1
替换模式匹配的整行以匹配ID。如果您需要使用多个选项,可以Or
将它们放在一起,如下所示:
Regex.Replace(input, pattern, replacement, RegexOptions.IgnoreCase Or RegexOptions.Singleline)
编辑#1:您使用了错误的方法来提取ID。您有一个组(\d+)
来捕获ID,但您在匹配时使用的是Regex.Replace
,这就是您获取文本中其他内容的原因。要匹配ID,请使用以下内容:
Dim input As String = "foo web id:2010 bar"
Dim pattern As String = ".*web id: ?(\d+).*"
Dim m As Match = Regex.Match(input, pattern, RegexOptions.IgnoreCase)
If m.Success Then
Dim id As String = m.Groups(1).Value
Console.WriteLine("ID: " & id)
Else
Console.WriteLine("No Match!")
End If
您会注意到我们引用Groups(1)
来保存(\d+)
群体所捕获的值。具有更多组的模式可能会导致混淆,尤其是嵌套组。在这些情况下,您可以使用命名组。以下是更新为使用命名组的相同代码:
Dim input As String = "foo web id:2010 bar"
Dim pattern As String = ".*web id: ?(?<ID>\d+).*" ' group name added '
Dim m As Match = Regex.Match(input, pattern, RegexOptions.IgnoreCase)
If m.Success Then
' refer to group by group name '
Dim id As String = m.Groups("ID").Value
Console.WriteLine("ID: " & id)
Else
Console.WriteLine("No Match!")
End If
答案 1 :(得分:1)
有点无关,但这段代码是你不应该在VB.NET中做的事情的集合。
您不应在字符串变量上使用旧的$
后缀,同样不应使用LCase$
之类的旧函数。应该使用框架中的等效函数。您也可以告诉您的朋友始终启用Option Strict
。这将抓住很多潜在的错误。
此外,要设置函数的返回值,......“更成熟”的方法是使用Return …
,而不是Functionname = …
。
所以“正确”的代码如下所示:
''// I’m assuming that `GetWebId` is the name of the function we’re in.
Function GetWebId(note As String) As String
Dim pattern As String = ".*web id: ?(\d+).*"
Dim replacement As String = "$1"
Return Regex.Replace(note.ToLower(), pattern, replacement)
End Function
请参阅Ahmad关于如何将“ignorecase”标志放入表达式的解决方案。