如何在VB.net中编写这个正则表达式?

时间:2010-09-14 14:42:19

标签: vb.net regex

我的同事需要我为他的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”不在同一行的文本也会被返回,我发现奇怪。

2 个答案:

答案 0 :(得分:3)

使用RegexOptions.IgnoreCase标志:

Regex.Replace(strNote, strPattern, strReplacement, RegexOptions.IgnoreCase)

如果您要忽略大小写,则不需要使用LCase。我还发现你的变量名中包含所有$符号很奇怪 - 它们在C#或VB.NET中都不应该有效。

<小时/> 编辑#2:我意识到您可能想要替换与$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”标志放入表达式的解决方案。