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

问题描述 投票:3回答:2

我正在为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(将在电子表格中显示“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”

谢谢您的帮助

.net regex excel openxml regex-group
2个回答
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
投票

根据我对案件的理解,我写了符合你需要的正则表达式(Link to example

这是表达式:

(&(?= SHRCL)SHRCL {1})(SHA-for-zud_sh(&(?SHRZL)))SHA-for-zud_sh)

© www.soinside.com 2019 - 2024. All rights reserved.