正则表达式:在 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 个组,以第一个条目为例,这些组是:
- 好的 THT PHP
- 就是这个
- 06222021
- Space字符
我需要一种方法:
- 将第 1、2、4 组替换为 String.Empty
或
- 仅获取第 3 组
您不需要 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?
匹配一个可选的空白字符
$
字符串结束
示例代码
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 it
或 Get this content
.
string result = Regex.Match(@"(?<=^(\w+\s){3}).*?(?=\s\d+\s?$)").Value;
我需要编写一个正则表达式来替换除单个组之外的所有内容。
例如
在 | 输出 |
---|---|
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 个组,以第一个条目为例,这些组是:
- 好的 THT PHP
- 就是这个
- 06222021
- Space字符
我需要一种方法:
- 将第 1、2、4 组替换为 String.Empty
或
- 仅获取第 3 组
您不需要 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?
匹配一个可选的空白字符$
字符串结束
示例代码
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 it
或 Get this content
.
string result = Regex.Match(@"(?<=^(\w+\s){3}).*?(?=\s\d+\s?$)").Value;