如何使用组匹配编写正则表达式?

时间:2009-10-21 16:47:47

标签: c# regex

这是数据源,存储在txt文件中的行:

servers[i]=["name1", type1, location3];
servers[i]=["name2", type2, location3];
servers[i]=["name3", type1, location7];

这是我的代码:

    string servers = File.ReadAllText("servers.txt");
    string pattern = "^servers[i]=[\"(?<name>.*)\", (.*), (?<location>.*)];$";

    Regex reg = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Multiline);
    Match m;

    for (m = reg.Match(servers); m.Success; m = m.NextMatch()) {
        string name = m.Groups["name"].Value;
        string location = m.Groups["location"].Value;                
    }

没有线条匹配。我做错了什么?

3 个答案:

答案 0 :(得分:2)

如果您不关心除服务器名称和位置之外的任何内容,则无需在正则表达式中指定其余输入。这可以让你避免不得不逃避括号,正如格雷姆正确指出的那样。尝试类似:

string pattern = "\"(?<name>.+)\".+\s(?<location>[^ ]+)];$"

这是

\"           = quote mark, 
(?<name>     = start capture group 'name', 
.+           = match one or more chars (could use \w+ here for 1+ word chars)
)            = end the capture group
\"           = ending quote mark
.+\s         = one or more chars, ending with a space
(?<location> = start capture group 'location',
[^ ]+        = one or more non-space chars
)            = end the capture group
];$          = immediately followed by ]; and end of string

我使用Rad Software的免费Regex Designer中的示例数据对此进行了测试,该版本使用.NET正则表达式引擎。

答案 1 :(得分:0)

试试这个

string pattern = "servers[i]=[\"(?<name>.*)\", (.*), (?<location>.*)];$";

答案 2 :(得分:0)

我不知道C#正则表达式是否与perl相同,但如果是这样,您可能想要转义[]个字符。 此外,还有额外的字符。试试这个:

string pattern = "^servers\[i\]=\[\"(?<name>.*)\", (.*), (?<location>.*)\];$";

编辑添加:在想知道为什么我的答案被贬低然后看Val的回答后,我意识到“额外的角色”是有原因的。它们是perl所谓的“命名捕获缓冲区”,我从未使用它,但原始代码片段确实如此。我已将我的答案更新为包含它们。