如何编写以逗号分隔列表捕获标记的正则表达式?

时间:2017-03-06 00:29:20

标签: c# regex

以下是我的意见:

#
tag1, tag with space, !@#%^, 

我想将它与正则表达式匹配并轻松生成以下元素:

  • TAG1
  • 带空格的标签
  • !@#%^

我知道我可以这样做:

var match = Regex.Match(input, @"^#[\n](?<tags>[\S ]+)$");
// if match is a success
var tags = match.Groups["tags"].Value.Split(',').Select(x => x.Trim());

但这是作弊,因为它涉及搞乱C#。使用正则表达式必须有一个简洁的方法来做到这一点。一定是......对吗? ; d

问题是:如何编写一个正则表达式,允许我迭代捕获并提取标签,而不需要拆分和修剪?

3 个答案:

答案 0 :(得分:2)

这有效(?ms)^\#\s+(?:\s*((?:(?!,|^\#\s+).)*?)\s*(?:,|$))+

它使用C#的 Capture Collection 来查找可变数量的字段数据
在一个记录中。

您可以进一步扩展正则表达式以立即获取所有记录 每个记录包含其自己的可变数量的字段数据。

正则表达式也有内置修剪功能。

扩展:

 (?ms)                   # Inline modifiers:  multi-line, dot-all
 ^ \# \s+                # Beginning of record
 (?:                     # Quantified group, 1 or more times, get all fields of record at once
      \s*                     # Trim leading wsp
      (                       # (1 start), # Capture collector for variable fields
           (?:                     # One char at a time, but not comma or begin of record
                (?!
                     , 
                  |  ^ \# \s+ 
                )
                .         
           )*?
      )                       # (1 end)
      \s* 
      (?: , | $ )             # End of this field, comma or EOL
 )+

C#代码:

string sOL = @"
#
tag1, tag with space, !@#%^, ";

Regex RxOL = new Regex(@"(?ms)^\#\s+(?:\s*((?:(?!,|^\#\s+).)*?)\s*(?:,|$))+");
Match _mOL = RxOL.Match(sOL);
while (_mOL.Success)
{
    CaptureCollection ccOL1 = _mOL.Groups[1].Captures;
    Console.WriteLine("-------------------------");
    for (int i = 0; i < ccOL1.Count; i++)
        Console.WriteLine("  '{0}'", ccOL1[i].Value );
    _mOL = _mOL.NextMatch();
}

输出:

-------------------------
  'tag1'
  'tag with space'
  '!@#%^'
  '??'
  ''
Press any key to continue . . .

答案 1 :(得分:-1)

作弊没有错;]

string input = @"#
tag1, tag with space, !@#%^, ";

string[] tags = Array.ConvertAll(input.Split('\n').Last().Split(','), s => s.Trim());

答案 2 :(得分:-1)

你可以在没有正则表达式的情况下完成它。把它分开就像这样:

var result = input.Split(new []{'\n','\r'}, StringSplitOptions.RemoveEmptyEntries).Skip(1).SelectMany(x=> x.Split(new []{','},StringSplitOptions.RemoveEmptyEntries).Select(y=> y.Trim()));