正则表达式组字符串,其中分隔符可以使用两次(.net Regex)
我正在为excel编写一个解析器,它可以更新文档中的值。我目前正在分析电子表格文档格式的页眉/页脚部分。excel中页眉/页脚的格式存储为纯文本,由以下内容分隔:正则表达式组字符串,其中分隔符可以使用两次(.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)以及该标记之后出现的任
&L
&C
&R
<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