以下是我的意见:
#
tag1, tag with space, !@#%^,
我想将它与正则表达式匹配并轻松生成以下元素:
我知道我可以这样做:
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
问题是:如何编写一个正则表达式,允许我迭代捕获并提取标签,而不需要拆分和修剪?
答案 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()));