Regex提取引号之间的字符串

本文关键字:字符串 之间 提取 Regex | 更新日期: 2023-09-27 18:06:12

我试图提取两个引号之间的字符串,我认为我有我的正则表达式工作,但它给了我两个字符串在我的GroupCollection,我不能让它忽略第一个,其中包括第一个引号和ID=

我要解析的字符串是

测试ID ="12345";你好

我想在一个组中返回12345,以便稍后可以在代码中操作它。我尝试了以下regex: http://regexr.com/3bgtl,代码如下:

nodeValue = "Test ID='"12345'" hello";
GroupCollection ids = Regex.Match(nodeValue, "ID='"([^'"]*)").Groups;

问题是GroupCollection包含两个条目:

ID ="12345

12345年

我只想让它返回第二个

Regex提取引号之间的字符串

使用正向向后操作符:

GroupCollection ids = Regex.Match(nodeValue, "(?<=ID='")[^'"]*").Groups;

您还使用了捕获组(括号),这就是为什么您得到2个结果。

有几种方法可以做到这一点。为了可读性,我喜欢命名的捕获组。

指定捕获组的正则表达式:

"(?<capture>.*?)"

你的代码应该是:

match.Groups["capture"].Value

你的代码完全没问题,是这里建议的所有解决方案中最有效的。捕获组允许以最快和最少资源消耗的方式匹配较大文本中的子字符串。

使用正则表达式所需要做的只是访问捕获的由圆括号定义的第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);

参见IDEONE demo

请查看正则表达式中的分组结构:

分组构造描述正则表达式的子表达式并捕获输入字符串的子字符串。可以使用分组结构执行以下操作:

  • 匹配在输入字符串中重复出现的子表达式。
  • 将量词应用于具有多个正则表达式语言元素的子表达式。有关量词的更多信息,请参见[正则表达式中的量词][3]。
  • 在[正则表达式]返回的字符串中包含子表达式。替换[4]和[Match]。结果][5]方法。
  • 从[Match]中检索单个子表达式。

注意如果您不需要重叠匹配,捕获组机制是这里的最佳解决方案。