正则表达式:在 VB.Net 中的其他组中查找特定组

Regular Expression: Find a specific group within other groups in VB.Net

我需要编写一个正则表达式来替换除单个组之外的所有内容。

例如

输出
OK THT PHP就是这样 06222021 就是这个
NO MTM PYT 获取此内容 111111 获取此内容

我写了下面的正则表达式:(\w{0,2}\s\w{0,3}\s\w{0,3}\s)(.*?)(\s\d{6}(\s|))

此正则表达式创建 4 个组,以第一个条目为例,这些组是:

  1. 好的 THT PHP
  2. 就是这个
  3. 06222021
  4. Space字符

我需要一种方法:

您不需要 4 组,您可以使用单个组 1 进行替换,并为最后一部分匹配 6-8 位数字,而不是仅匹配 6 位。

请注意,此 \w{0,2} 也将匹配一个空字符串,如果必须至少有一个单词 char,您可以使用 \w{1,2}

^\w{0,2}\s\w{0,3}\s\w{0,3}\s(.*?)\s\d{6,8}\s?$
  • ^ 字符串开头
  • \w{0,2}\s\w{0,3}\s\w{0,3}\s 匹配 3 个单词字符,中间有一个量词和一个空格
  • (.*?) 捕获 组 1 尽可能少地匹配任何字符
  • \s\d{6,8}匹配一个空白字符和6-8位数字
  • \s? 匹配一个可选的空白字符
  • $ 字符串结束

Regex demo

示例代码

Dim s As String = "OK THT PHP This is it 06222021"
Dim result As String = Regex.Replace(s, "^\w{0,2}\s\w{0,3}\s\w{0,3}\s(.*?)\s\d{6,8}\s?$", "")
Console.WriteLine(result)

输出

This is it

我的方法不适用于组,而是使用替换操作。匹配本身会产生所需的结果。

它使用环视表达式。要找到两个其他模式之间的模式,您可以使用一般形式

(?<=prefix)find(?=suffix)

这只会 return find 作为匹配项,不包括前缀和后缀。

如果我们插入你的表达式,我们得到

(?<=\w{0,2}\s\w{0,3}\s\w{0,3}\s).*?(?=\s\d{6}\s?)

我将 (\s|) 简化为 \s?。我们也可以完全放弃它,因为我们不关心尾随 spaces.

(?<=\w{0,2}\s\w{0,3}\s\w{0,3}\s).*?(?=\s\d{6})

请注意,如果我们有超过 6 位数字,这也有效,因为正则表达式在找到 6 位数字后停止搜索并且不关心后面的内容。

如果像 123 OK THT PHP This is it 06222021 中的模式之前有其他内容,这也会给出匹配。我们可以通过指定搜索必须从 ^.

字符串的开头开始来排除此类结果

如果单词和数字的确切长度无关紧要,我们只写

(?<=^\w+\s\w+\s\w+\s).*?(?=\s\d+)

如果 find 部分可以包含数字,我们必须指定我们要匹配到 $ 的行尾(并再次包含可能的 space )。

(?<=^\w+\s\w+\s\w+\s).*?(?=\s\d+\s?$)

最后,我们对 word-space:

的 3 次出现使用量词
(?<=^(\w+\s){3}).*?(?=\s\d+\s?$)

这很紧凑,只会 return This is itGet this content.

string result = Regex.Match(@"(?<=^(\w+\s){3}).*?(?=\s\d+\s?$)").Value;