如何在正则表达式中留出空间?

时间:2016-01-05 21:33:18

标签: c# regex

我想在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);
        }            
    }
}

2 个答案:

答案 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([^:]+):替换它。