2010-09-14 89 views
0

我的同事需要我为他的vb.net应用程序写一个正则表达式。如何在VB.net中编写这个正则表达式?

我不知道VB和他不知道正则表达式。

他所需要的正则表达式是:

/.*web id: ?(\d+).*/i 

基本上,他需要搜索字符串类似“网络ID:345”或“网络ID:2534”和检索的ID。

他把我给他上面,并能够一起把这个:

Dim strPattern As String = ".*web id: ?(\d+).*" 
Dim strReplacement$ = "$1" 

GetWebId$ = Regex.Replace(LCase$(strNote$), strPattern$, strReplacement$) 

但是我不知道怎么传不区分大小写的标志? (他目前的修复是使整个字符串小写第一)

另外一件事情,我似乎无法弄清楚是当他运行此字符串与多行,任何文本不在同一行作为“网络ID:\ D”也正在返回,我觉得很奇怪。如果你要忽略大小写应该没有必要使用LCase

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

回答

3

使用RegexOptions.IgnoreCase标志。我还觉得奇怪的是,你的变量名中包含所有$符号 - 它们不应该在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 
+0

谢谢,我的大问题虽然是在多行文本上运行时发生的。 – 2010-09-14 14:45:57

+0

@John查看我的更新。如果您仍然有问题,请使用“多行”文本输入一些示例输入来更新您的文章。 – 2010-09-14 15:02:20

+0

这正是他想要的,谢谢! – 2010-09-14 15:24:07

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的解决方案。

+0

谢谢,我发现要处理他需要包含标志'RegexOptions.Singline'的多线问题。他有办法通过2个选项吗? – 2010-09-14 15:15:34