分隔符可以使用两次的正则表达式组字符串(.net 正则表达式)
Regex group string where the delimiter can be used twice (.net regex)
我正在为 excel 编写一个解析器,它可以更新文档中的值。我目前正在解析电子表格文档格式的 header/footer 部分。 header/footer in excel 的格式存储为纯文本,分隔符:
&L
&C
&R
因此您的 header / 页脚在 xml 中可能如下所示:
<odaysDate&CDocumentTitle&RAuthors Name
如果你只有左和右 header 你的 xml 字符串看起来像:
<odaysDate&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])
将匹配 &
和它后面的 L
、R
或 C
字母,由于捕获括号,该值将被提取到结果数组中.
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_])
我正在为 excel 编写一个解析器,它可以更新文档中的值。我目前正在解析电子表格文档格式的 header/footer 部分。 header/footer in excel 的格式存储为纯文本,分隔符:
&L
&C
&R
因此您的 header / 页脚在 xml 中可能如下所示:
<odaysDate&CDocumentTitle&RAuthors Name
如果你只有左和右 header 你的 xml 字符串看起来像:
<odaysDate&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])
将匹配 &
和它后面的 L
、R
或 C
字母,由于捕获括号,该值将被提取到结果数组中.
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_])