我正在使用C#从指定的字符串中检索子字符串。
例如:我有一个像这样的字符串:
\ a {文档标题} \ aDoc ID \ rDoc日期\ rDoc版本\ rDoc状态\ a:\ r:\ r:\ r:\ a {DocID} \ r {DocDate} \ r {DocVersion} \ r {DocStatus} \ a \ a \ r
然后我要获取“ \ a”,“ \ r”,“ \ a:\ r:\ r:\ r:\ a”之间的所有子字符串... 我已经创建了一个模式来匹配所有“ \ a”,“ \ r”,...,如下所示:
((\\a[:]{0,1})+|(\\r[:]{0,1})+)+
问题是:如何获得与上述模式不匹配的所有子字符串?
预期结果是:“ {Doc Title}”,“ Doc ID”,“ Doc Date”,...
答案 0 :(得分:2)
首先,请缩短您的正则表达式。
{0,1}
是?
[:]
就是:
正则表达式的简化版是(\\[ar]:?)+
。此正则表达式允许回溯导致在拆分操作中更难使用的原因。通过使用原子组来避免它:(?>\\[ar]:?)+
现在,您可以拆分字符串以获取所有其他字符串并过滤空字符串:
var input = @"\a{Doc Title}\aDoc ID\rDoc Date\rDoc Version\rDoc Status\a:\r:\r:\r:\a{DocID}\r{DocDate}\r{DocVersion}\r{DocStatus}\a\a\r";
var pattern = @"(?>\\[ar]:?)+";
var items = Regex.Split(input, pattern);
foreach (var item in items)
if (!string.IsNullOrWhiteSpace(item))
Console.WriteLine(item);