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

时间:2019-03-26 16:38:32

标签: .net regex excel openxml regex-group

我正在为Excel编写一个解析器,该解析器可以更新文档中的值。我目前正在解析电子表格文档格式的页眉/页脚部分。 excel中页眉/页脚的格式存储为纯文本,由以下分隔:

  • &L
  • &C
  • &R

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

&LTodaysDate&CDocumentTitle&RAuthors Name

如果只有左右标题,那么您的xml字符串将如下所示:

&LTodaysDate&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” 第二组:“猪肉和豆类”

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

您可以使用

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

请参见regex demo(&[LRC])将与&匹配,并在其后跟一个LRC字母,由于捕获括号,该值将被提取到结果数组中。

enter image description here

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

答案 1 :(得分:1)

据我了解,我编写的正则表达式符合您的需求(Link to example

这是表达式:

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