我正在为Excel编写一个解析器,该解析器可以更新文档中的值。我目前正在解析电子表格文档格式的页眉/页脚部分。 excel中页眉/页脚的格式存储为纯文本,由以下分隔:
&L
&C
&R
因此您的页眉/页脚在xml中可能如下所示:
<odaysDate&CDocumentTitle&RAuthors Name
如果只有左右标题,那么您的xml字符串将如下所示:
<odaysDate&RAuthors Name
我已尝试创建一种模式,该模式可以检测到您的每个组并解析出该组件(即&L
,&C
,&R
)以及之后出现的所有文本标签。
正则表达式字符串是:(&.{1})([A-Za-z\d_ ]*)
(Link to example)
但是我遇到一个边缘问题,这意味着我无法正确解析包含&符的excel标头。
在文档的excel标头中,标题必须带有“&”号(纯文本),您必须键入&&
。因此,带有&符号的标头的xml可能类似于:
&RPork && Beans
(在电子表格中显示“猪肉和豆子”)。
我的正则表达式无法应付早号“&”号。在第一组((&.{1})
)中,我要求任何带有“&”号和其后跟字符(即L / C / R)的东西。当2个&符出现时,我如何告诉这个组不包括在内。我的正则表达式技能是新手,我可以在更高层次上描述我想要的东西:
我想在看到&L /&C /&R的任何地方拆分字符串,并捕获此后的所有文本,直到另一个&L /&C /&R分隔符(不包括新的换行符等)。我最好在下面的C#linq中对此进行描述。
(&.{1}.Where(c => c != '&'))([A-Za-z\d_ ]*)
对于字符串“&RPork && Beans”
我的正则表达式通过2个组分别捕获2个匹配项:
匹配1
第1组:“&R”
组2:“猪肉”
比赛2
第1组:“ &&”
第2组:“豆子”
,我希望它匹配一次:
第1组:“&R”
第二组:“猪肉和豆类”
感谢您的帮助
答案 0 :(得分:1)
您可以使用
var result = Regex.Split(s, "(&[LRC])").Where(x => !string.IsNullOrWhiteSpace(x));
请参见regex demo。 (&[LRC])
将与&
匹配,并在其后跟一个L
,R
或C
字母,由于捕获括号,该值将被提取到结果数组中。
var s = "&RPork && Beans&CDocument Title";
var result = Regex.Split(s, "(&[LRC])")
.Where(x => !string.IsNullOrWhiteSpace(x))
.ToList();
var data = result.Where((c,i) => i % 2 == 0).Zip(result.Where((c,i) => i % 2 != 0),
(delimiter, value) => new KeyValuePair<string, string>(delimiter, value));
foreach (var kvp in data)
Console.WriteLine("Delimiter: {0}\nValue: {1}", kvp.Key, kvp.Value);
输出:
Delimiter: &R
Value: Pork && Beans
Delimiter: &C
Value: Document Title
答案 1 :(得分:1)
据我了解,我编写的正则表达式符合您的需求(Link to example )
这是表达式:
(&(?= [RCL])[RCL] {1})([A-Za-z \ d_] (&(?![RCL])) [A-Za -z \ d_] )