C# 正则表达式捕获组不工作
C# Regex capturing group not working
在下面的代码中,我想捕获以 test 开头且后跟双引号括起来的文本的所有内容。例如
test"abc"
test"rst"
代码运行良好。
private void testRegex()
{
string st = "this test\"abc\"= or test\"rst\"\"uvw\" or test(def)(abc) is a test.";
Regex oRegex = new Regex("test\".*?\"");
foreach (Match mt in oRegex.Matches(st))
{
Console.WriteLine(mt.Value);
}
}
然后,从上面的捕获中,我想捕获单词 test 后面的子表达式(在上面的示例中,这些子表达式将是 "abc" 和 "rst",包括“。我尝试了以下它正确地给我:
"abc"
"rst"
private void testRegex()
{
string st = "this test\"abc\"= or test\"rst\"\"uvw\" or test(def)(abc) is a test.";
Regex oRegex = new Regex("test(\".*?\")");
foreach (Match mt in oRegex.Matches(st))
{
Console.WriteLine(mt.Groups[1].Value);
}
}
问题: 现在我想捕获两个子表达式 1. "abc" 和 "rst" 2. 除 " 之外的任何字符,匹配测试"abc" 和 test"rst"。所以,我尝试了以下但如下所示,匹配 "rst""uvw" 的第 1 组和第 2 组是错误的。我需要 [= 的第 1 组44=]"uvw" 为 "rst" 并且第 2 组为空,因为 "rst" 后面的字符是 ":
第 1 组:"abc"
第 2 组:=
第 1 组:"rst"
第 2 组:你
private void testRegex()
{
string st = "this test\"abc\"= or test\"rst\"\"uvw\" or test(def)(abc) is a test.";
Regex oRegex = new Regex("test(\".*?\")([^\"])");
foreach (Match mt in oRegex.Matches(st))
{
Console.WriteLine(mt.Groups[1].Value);
Console.WriteLine(mt.Groups[2].Value);
}
}
您一定在寻找
test("[^"]*")([^"])?
见demo
我做了 2 处更改:
- 使用否定字符 class
[^"]*
(匹配除双引号之外的 0 个或多个字符)而不是延迟匹配任何字符 .*?
- 使用
?
量词使 [^"]
可选。
两个备用版本:
(?<=test)("[^"]+")([^"])?
如果您想将结果保存在一个地方:
(?<=test)("[^"]+"[^"]?)
在下面的代码中,我想捕获以 test 开头且后跟双引号括起来的文本的所有内容。例如
test"abc"
test"rst"
代码运行良好。
private void testRegex()
{
string st = "this test\"abc\"= or test\"rst\"\"uvw\" or test(def)(abc) is a test.";
Regex oRegex = new Regex("test\".*?\"");
foreach (Match mt in oRegex.Matches(st))
{
Console.WriteLine(mt.Value);
}
}
然后,从上面的捕获中,我想捕获单词 test 后面的子表达式(在上面的示例中,这些子表达式将是 "abc" 和 "rst",包括“。我尝试了以下它正确地给我:
"abc"
"rst"
private void testRegex()
{
string st = "this test\"abc\"= or test\"rst\"\"uvw\" or test(def)(abc) is a test.";
Regex oRegex = new Regex("test(\".*?\")");
foreach (Match mt in oRegex.Matches(st))
{
Console.WriteLine(mt.Groups[1].Value);
}
}
问题: 现在我想捕获两个子表达式 1. "abc" 和 "rst" 2. 除 " 之外的任何字符,匹配测试"abc" 和 test"rst"。所以,我尝试了以下但如下所示,匹配 "rst""uvw" 的第 1 组和第 2 组是错误的。我需要 [= 的第 1 组44=]"uvw" 为 "rst" 并且第 2 组为空,因为 "rst" 后面的字符是 ":
第 1 组:"abc"
第 2 组:=
第 1 组:"rst"
第 2 组:你
private void testRegex()
{
string st = "this test\"abc\"= or test\"rst\"\"uvw\" or test(def)(abc) is a test.";
Regex oRegex = new Regex("test(\".*?\")([^\"])");
foreach (Match mt in oRegex.Matches(st))
{
Console.WriteLine(mt.Groups[1].Value);
Console.WriteLine(mt.Groups[2].Value);
}
}
您一定在寻找
test("[^"]*")([^"])?
见demo
我做了 2 处更改:
- 使用否定字符 class
[^"]*
(匹配除双引号之外的 0 个或多个字符)而不是延迟匹配任何字符.*?
- 使用
?
量词使[^"]
可选。
两个备用版本:
(?<=test)("[^"]+")([^"])?
如果您想将结果保存在一个地方:
(?<=test)("[^"]+"[^"]?)