C# 正则表达式提取引号之间的字符串
我试图在两个引号之间提取一个字符串,我以为我的正则表达式可以工作,但它在我的GroupCollection中给了我两个字符串,我不能让它忽略第一个字符串,其中包括第一个引号和ID= 我要分析的字符串是 测试ID=12345你好 我想在一个组中返回12345,以便以后可以在代码中操作它。我使用以下代码尝试了以下正则表达式::C# 正则表达式提取引号之间的字符串,c#,regex,C#,Regex,我试图在两个引号之间提取一个字符串,我以为我的正则表达式可以工作,但它在我的GroupCollection中给了我两个字符串,我不能让它忽略第一个字符串,其中包括第一个引号和ID= 我要分析的字符串是 测试ID=12345你好 我想在一个组中返回12345,以便以后可以在代码中操作它。我使用以下代码尝试了以下正则表达式:: nodeValue = "Test ID=\"12345\" hello"; GroupCollection ids = Regex.
nodeValue = "Test ID=\"12345\" hello";
GroupCollection ids = Regex.Match(nodeValue, "ID=\"([^\"]*)").Groups;
问题在于GroupCollection包含两个条目:
ID=12345
12345
我只希望它返回第二个。使用正向查找运算符:
GroupCollection ids = Regex.Match(nodeValue, "(?<=ID=\")[^\"]*").Groups;
您还使用了一个捕获组作为括号,这就是为什么会得到两个结果。有几种方法可以实现这一点。为了可读性,我喜欢命名的捕获组 具有命名捕获组的正则表达式:
"(?<capture>.*?)"
您的代码完全正常,并且是这里建议的所有解决方案中最有效的。捕获组允许以最快、消耗资源最少的方式匹配较大文本中的子字符串 使用正则表达式只需访问由圆括号定义的捕获组1。像这样:
var nodeValue = "Test ID=\"12345\" hello";
GroupCollection ids = Regex.Match(nodeValue, "ID=\"([^\"]*)").Groups;
Console.WriteLine(ids[1].Value);
// or just on one line
// Console.WriteLine(Regex.Match(nodeValue, "ID=\"([^\"]*)").Groups[1].Value);
看
请看一看:
分组构造描述正则表达式的子表达式并捕获输入字符串的子字符串。可以使用分组构造执行以下操作:
匹配在输入字符串中重复的子表达式。
将量词应用于具有多个正则表达式语言元素的子表达式。有关量词的更多信息,请参见[正则表达式中的量词][3]。
在[Regex.Replace][4]和[Match.Result][5]方法返回的字符串中包含子表达式。
从[Match.Groups][6]属性中检索单个子表达式,并将其作为一个整体与匹配的文本分开处理。
请注意,如果您不需要重叠匹配,捕获组机制是这里的最佳解决方案。您需要打印组1。这非常有效,感谢您的快速响应。我使用的是组,因为我相信在某些情况下,ID的实例不止一个,而且它实际上在稍后被传递到替换中。
var nodeValue = "Test ID=\"12345\" hello";
GroupCollection ids = Regex.Match(nodeValue, "ID=\"([^\"]*)").Groups;
Console.WriteLine(ids[1].Value);
// or just on one line
// Console.WriteLine(Regex.Match(nodeValue, "ID=\"([^\"]*)").Groups[1].Value);