分隔符可以使用两次的正则表达式组字符串(.net 正则表达式)

Regex group string where the delimiter can be used twice (.net regex)

我正在为 excel 编写一个解析器,它可以更新文档中的值。我目前正在解析电子表格文档格式的 header/footer 部分。 header/footer in excel 的格式存储为纯文本,分隔符:

因此您的 header / 页脚在 xml 中可能如下所示:

&LTodaysDate&CDocumentTitle&RAuthors Name

如果你只有左和右 header 你的 xml 字符串看起来像:

&LTodaysDate&RAuthors Name

我尝试创建一个模式,可以检测每个组并解析组件(即 &L&C&R)以及出现的任何文本在那个标签之后。


正则表达式字符串是这样的(&.{1})([A-Za-z\d_ ]*) (Link to example)

但是我有一个边缘大小写问题,这意味着我无法正确解析包含 & 符号的 excel header。

在 excel header 中,要使您的文档在标题中有一个 & 符号(这是纯文本),您必须键入 &&。所以 header 的 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 组:"Pork "

匹配 2
第 1 组:“&&” 第 2 组:“豆类”

我希望它匹配一次:
第 1 组:“&R” 第 2 组:"Pork && Beans"

感谢您的帮助

您可以使用

var result = Regex.Split(s, "(&[LRC])").Where(x => !string.IsNullOrWhiteSpace(x));

regex demo(&[LRC]) 将匹配 & 和它后面的 LRC 字母,由于捕获括号,该值将被提取到结果数组中.

Another usage example:

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 )

这是表达式:

(&(?=[RCL])[RCL]{1})([A-Za-z\d_ ](&(?![RCL]))[ A-Za-z\d_])