我已经写了这个非常简单的正则表达式代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace RegexTest1
{
class Program
{
static void Main(string[] args)
{
string a = "\"foobar123==\"";
Regex r = new Regex("^\"(.*)\"$");
Match m = r.Match(a);
if (m.Success)
{
foreach (Group g in m.Groups)
{
Console.WriteLine(g.Index);
Console.WriteLine(g.Value);
}
}
}
}
}
但是输出是
0 “ foobar123 ==” 1个 foobar123 ==
我不明白为什么要打印两次。为什么要在索引0处进行捕获?当我在正则表达式中说^\"
但我没有为此使用捕获时。
抱歉,如果这是非常基本的,但是我每天都不会写Regex。
据我说,这段代码应该只打印一次,索引应该是1,值应该是foobar ==
发生这种情况是因为零组很特殊:它返回整个匹配项。
从正则表达式文档(添加重点):
一个简单的正则表达式模式说明了如何以编程方式或使用正则表达式语言语法来引用编号(未命名)和命名组。正则表达式
((?<One>abc)\d+)?(?<Two>xyz)(.*)
按编号和名称生成以下捕获组。第一个捕获组(数字0)始终引用整个模式。
# Name Group
- ---------------- --------------------------------
0 0 (default name) ((?<One>abc)\d+)?(?<Two>xyz)(.*)
1 1 (default name) ((?<One>abc)\d+)
2 2 (default name) (.*)
3 One (?<One>abc)
4 Two (?<Two>xyz)
如果不想看到它,请从第一组开始输出。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句