我无法捕捉括号。
我有一个包含此格式数据的大文件:
I.u[12] = {n: "name1",...};
I.u[123] = {n: "name2",...};
I.u[1234] = {n: "name3",...};
如果我提供了ID,我想创建一个系统,帮助我从文件中获取名称(此处为name1
,name2
,name3
)(此处{{1} },12
,123
)。我有以下代码:
1234
正则表达式在文件中找到了正确的行,但我真的不知道它为什么不提取我想要的名称,
public static string GetItemName(int id)
{
Regex regex = new Regex(@"^I.u\["+id+@"\]\s=\s{n:\s(.+),.+};$");
Match m= GetMatch(regex,filepath);
if(m.Success) return m.Groups[0].Value;
else return "unavailable";
}
public static Match GetMatch(Regex regex, string filePath)
{
Match res = null;
using (StreamReader r = new StreamReader(filePath))
{
string line;
while ((line = r.ReadLine()) != null)
{
res = regex.Match(line);
if (res.Success) break;
}
}
return res;
}
返回文件中的整行,而不是名称...我尝试了很多东西,甚至将if(m.Success) return m.Groups[0].Value;
更改为m.Groups[0]
但它没有用。
我现在搜索了一会儿但没有成功。你知道出了什么问题吗?
答案 0 :(得分:3)
根据您更新的问题,我可以看到您使用的是贪婪量词:.+
。这将尽可能匹配。您需要一个被动修改器,它只会根据需要进行匹配:.+?
试试这个:
Regex regex = new Regex(@"^I.u\["+id+@"\]\s=\s\{n:\s(?<Name>.+?),.+\};$", RegexOptions.Multiline);
然后:
if(m.Success) return m.Groups["Name"].Value;
答案 1 :(得分:2)
正如其他人所指出的那样:
if(m.Success) return m.Groups[0].Value;
应该是:
if(m.Success) return m.Groups[1].Value;
但是,这将返回包含引号的"name1"
。尝试并修改您的正则表达式模式:
@"^I.u\["+id+@"\]\s=\s{n:\s""(.+)"",.+};$"
将从m.Groups[1].Value
答案 2 :(得分:0)
因为您指的是错误的组号。它应该是1
而不是0
无论您拥有多少个群组,群组0
始终都会包含整个匹配项。
正则表达式应该是
^I.u\["+id+@"\]\s*=\s*{n:\s*""(.+)"",.+};$