我试图在两个引号之间提取一个字符串,我认为我的正则表达式正在工作,但它在我的GroupCollection中给了我两个字符串,我无法将它转到忽略第一个,包括第一个引用和ID =
我要解析的字符串是
测试ID =" 12345"喂
我想在一个组中返回12345,以便稍后我可以在代码中操作它。我尝试了以下正则表达式http://regexr.com/3bgtl,使用以下代码:
nodeValue = "Test ID=\"12345\" hello";
GroupCollection ids = Regex.Match(nodeValue, "ID=\"([^\"]*)").Groups;
问题是GroupCollection包含两个条目:
ID =#&34; 12345
12345
我只想让它返回第二个。
答案 0 :(得分:2)
使用积极的lookbehind运算符:
GroupCollection ids = Regex.Match(nodeValue, "(?<=ID=\")[^\"]*").Groups;
您还使用了捕获组(括号),这就是您获得2个结果的原因。
答案 1 :(得分:1)
有几种方法可以实现这一目标。我喜欢命名捕获组以提高可读性。
具有命名捕获组的正则表达式:
"(?<capture>.*?)"
您的代码将是:
match.Groups["capture"].Value
答案 2 :(得分:1)
您的代码完全正常,并且是此处建议的所有解决方案中效率最高的代码。捕获组允许以最快和最少资源消耗的方式匹配较大文本中的子字符串。
您需要对正则表达式执行的操作只是访问由圆括号定义的捕获的组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
请查看Grouping Constructs in Regular Expressions:
分组构造描述正则表达式的子表达式并捕获输入字符串的子字符串。您可以使用分组构造执行以下操作:
- 匹配在输入字符串中重复的子表达式。
- 将量词应用于具有多个正则表达式语言元素的子表达式。有关量词的更多信息,请参阅[正则表达式中的量词] [3]。
- 在[Regex.Replace] [4]和[Match.Result] [5]方法返回的字符串中包含子表达式。
- 从[Match.Groups] [6]属性中检索单个子表达式,并将它们作为一个整体与匹配的文本分开处理。
注意如果你不需要重叠匹配,捕获组机制是最好的解决方案。