Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正则表达式组字符串,其中分隔符可以使用两次(.net Regex)_.net_Regex_Excel_Openxml_Regex Group - Fatal编程技术网

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

正则表达式组字符串,其中分隔符可以使用两次(.net Regex),.net,regex,excel,openxml,regex-group,.net,Regex,Excel,Openxml,Regex Group,我正在为excel编写一个解析器,它可以更新文档中的值。我目前正在分析电子表格文档格式的页眉/页脚部分。excel中页眉/页脚的格式存储为纯文本,由以下内容分隔: &L &C &R 因此,您的页眉/页脚在xml中可能如下所示: <odaysDate&CDocumentTitle&RAuthors姓名 如果您只有左标题和右标题,则xml字符串如下所示: <odaysDate&RAuthors名称 我尝试创建一个模式,可以检测每个组并解析出组件(即&L,&C,&R)以及该标记之后出现的任

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

  • &L
  • &C
  • &R
因此,您的页眉/页脚在xml中可能如下所示:

<odaysDate&CDocumentTitle&RAuthors姓名

如果您只有左标题和右标题,则xml字符串如下所示:

<odaysDate&RAuthors名称

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


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

然而,我有一个附带的问题,这意味着我不能正确解析包含符号的excel标题

在excel标题中,您的文档标题中必须键入
&&
,才能在标题中使用符号和(这是纯文本)。因此,带有符号的标头的xml可能如下所示:

&RPork&Beans
(将在电子表格中显示“Pork&Beans”)

我的正则表达式无法处理过早的符号和。在第一组(
(&.{1})
)中,我要的是任何带有符号和其后字符的东西(即信用证/收据)。当有2个符号时,我如何告诉此组不包括。我的正则表达式技能非常初级,我可以在更高的层次上描述我想要的:

我希望在看到&L/&C/&R的任何位置拆分字符串,并捕获其后的所有文本,直到另一个&L/&C/&R分隔符(不包括新行空格等)。我可以用下面的C#linq来最好地描述这一点

(&.{1}.Where(c=>c!='&')([A-Za-z\d!]*)

对于字符串“&RPork&&Beans”

my regex捕获2个匹配项,每个匹配项包含2个组:

匹配1
第1组:“&R” 第2组:“猪肉”

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

我希望它匹配一次:
第1组:“&R” 第二组:“猪肉和豆类”

感谢您的帮助

您可以使用

var result = Regex.Split(s, "(&[LRC])").Where(x => !string.IsNullOrWhiteSpace(x));
看。
(&[LRC])
将匹配
&
L
R
C
字母,由于捕获括号,该值将被提取到结果数组中

:


根据我对该案例的理解,我已经编写了符合您需要的正则表达式( )

这是一个表达:


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

对不起,您不能使用
Regex.Split(&[LRC]))
?@WiktorStribiżew老实说,我在regexr上做了我所有的regex在线测试,完全掩盖了.net可以做到这一点>>@WiktorStribiżew我只是把它放到我的代码中,并运行一些测试来验证解决方案是否有效。我已经记下了你的答案!谢谢你的全面回答。我已经在代码中实现了这种方法
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: &CValue: Document Title