这是数据源,存储在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;
}
没有线条匹配。我做错了什么?
答案 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所谓的“命名捕获缓冲区”,我从未使用它,但原始代码片段确实如此。我已将我的答案更新为包含它们。