我想在New之后获取值:双引号。 当ListName中没有空格时,我可以检索该值。但是如果我在列表名称之间放置空格(例如NewFinancial History:\“xyz \”),它会抛出以下错误:
解析“NewFinancial History:”(?[^“] *)”“ - 组名无效:组名必须以单词字符开头。
它在下面的行引发错误 var matches = Regex.Matches(contents,regex,RegexOptions.Singleline);
以下是我的代码。
string contents = " testing NewFinancial History:\"xyz\" ";
var keys = Regex.Matches(contents, @"New(.+?):", RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace).OfType<Match>().Select(m => m.Groups[0].Value.Trim().Replace(":", "")).Distinct().ToArray();
foreach (string key in keys)
{
List<string> valueList = new List<string>();
string listNameKey = key;
string regex = "" + listNameKey + ":" + "\"(?<" + listNameKey + ">[^\"]*)\"";
var matches = Regex.Matches(contents, regex, RegexOptions.Singleline);
foreach (Match match in matches)
{
if (match.Success)
{
string value = match.Groups[key].Value;
valueList.Add(value);
}
}
}
答案 0 :(得分:1)
我不明白为什么你也使用&#34;键&#34;作为小组的名字。
您遇到的问题是群组名称 不能包含空格,但你可以简单地创建一个匿名组。
string contents = " testing NewFinancial History:\"xyz\" ";
var keys = Regex.Matches(contents, @"New(.+?):", RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace).OfType<Match>().Select(m => m.Groups[0].Value.Trim().Replace(":", "")).Distinct().ToArray();
foreach (string key in keys)
{
List<string> valueList = new List<string>();
string listNameKey = key;
string regex = "" + listNameKey + ":" + "\"([^\"]*)\""; //create an anonymous capture group
var matches = Regex.Matches(contents, regex, RegexOptions.Singleline);
foreach (Match match in matches)
{
if (match.Success)
{
string value = match.Groups[0].Value; //get the first group
valueList.Add(value);
}
}
}
答案 1 :(得分:1)
将您的foreach块更改为
List<string> valueList = new List<string>();
string listNameKey = key;
string regex = "" + listNameKey + ":" + "\"(?<" +
listNameKey.Replace(" ","") + ">[^\"]*)\""; // Removing spaces in the group name here
var matches = Regex.Matches(contents, regex, RegexOptions.Singleline);
foreach (Match match in matches)
{
if (match.Success)
{
string value = match.Groups[key.Replace(" ", "")].Value; // Removing spaces here
valueList.Add(value);
}
}
关键是组名不能有空格,因此您需要在声明捕获组名称的位置用空字符串替换它们。
请参阅IDEONE demo
请注意,您的New(.+?):
正则表达式没有要忽略的空格,建议您删除RegexOptions.IgnorePatternWhitespace
标记。您可以使用效率更高的New([^:]+):
替换它。