我正在为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
(将在电子表格中显示“Pork&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”第2组:“Pork && Beans”
谢谢您的帮助
你可以用
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
根据我对案件的理解,我写了符合你需要的正则表达式(Link to example)
这是表达式:
(&(?= SHRCL)SHRCL {1})(SHA-for-zud_sh(&(?SHRZL)))SHA-for-zud_sh)