使用正则表达式在两个关键词之间得到一个单词

时间:2009-07-27 19:44:05

标签: c# .net asp.net vb.net regex

已经有一段时间了,因为我使用了正则表达式,我希望我正在尝试做的事情是可能的。我有一个程序可以发送关于特定文件的自动响应,我想在我知道永远不会改变的两个单词之间抓取文本。在这个例子中,这些词是“关于”和“发送”

Dim subject As String = "Information regarding John Doe sent."
Dim name As String = Regex.IsMatch(subject, "")

所以在这种情况下,我希望能够得到“John Doe”。我提出的每个正则表达式都包含“关于”和“已发送”等字样。如何将这些单词用作边界但不包括在匹配中?

3 个答案:

答案 0 :(得分:3)

假设"Information regarding ""sent."永不改变,您可以使用捕获组获取"John Doe"

^Information regarding (.+) sent.$

你用这种方式:

Dim regex As New Regex("^Information regarding (.+) sent.$")
Dim matches As MatchCollection = regex.Matches(subject)

现在,它只应匹配一次,您可以从匹配的Groups属性中获取组:

For Each match As Match In matches  
  Dim groups As GroupCollection = match.Groups
  Console.WriteLine(groups.Item(1).Value) // prints John Doe
Next

答案 1 :(得分:0)

你的正则表达式基本上应该是这样的:

.*regarding (.+) sent.*

您正在寻找的数据将位于第一个捕获变量中(Perl中为1美元)。

答案 2 :(得分:0)

虽然匹配所有组是一种做法,但我会使用两个不匹配的组和一个名为froup的组,以便它只返回您想要的组。这会给你正则表达式:

(?:regarding )(?<filename>.*)(?: sent)

这将使您能够从组中调用文件名,例如

Dim rx As New Regex("(?:regarding )(?<filename>.*)(?: sent)", _
           RegexOptions.Compiled )
Dim text As String = "Information regarding John Doe sent."
Dim matches As MatchCollection = rx.Matches(text)
'The lazy way to get match, should print 'John Doe'
Console.WriteLine( matches[0].Groups.Item("filename").Value ) 

在msdn网站here

上找到了一个很好的Regex资源