C# 正则表达式匹配与拆分相同的字符串

Posted

技术标签:

【中文标题】C# 正则表达式匹配与拆分相同的字符串【英文标题】:C# Regex Match Vs Split for same string 【发布时间】:2015-03-15 23:19:58 【问题描述】:

我在 Linqpad 中使用正则表达式来提取字符串。我有一些疑问要分享。任何人都可以对这个问题有所了解。 -

string s = "abc|xyz";
Regex.Match(s, @"(\w*)[|]1(\w*)").Dump();
Regex.Split(s, @"(\w*)[|]1(\w*)").Dump();

使用Regex.Match,我可以轻松提取两个组。

但我不明白为什么Regex.Split 中有两个空条目。

【问题讨论】:

【参考方案1】:

让我们分析一下你的字符串:

abc|xyz
\_____/  <-- the match
\_/      <-- capture group 1
    \_/  <-- capture group 2

Regex.Split 将捕获的组包含到结果数组中。

分裂发生在整场比赛中,就在那儿:

abc|xyz
\      \

所以在匹配之前有一个空字符串,在匹配之后有一个空字符串。由于前面提到的拆分行为,中间的两个项目被插入:

如果在Regex.Split 表达式中使用了捕获括号,则任何捕获的文本都将包含在结果字符串数组中。例如,如果将字符串“plum-pear”拆分到位于捕获括号内的连字符上,则返回的数组包含一个包含连字符的字符串元素。

【讨论】:

可以分组吗? 你为什么不简单地在| char 上拆分,根本不使用正则表达式? 你要么需要塑造整个模式以满足你的需要,要么你可以循环匹配和组,并在循环中构建你的字符串列表(基本上,用 Split 重新实现您需要的差异)。 Split 只是一个方便的函数,自己很容易实现。

以上是关于C# 正则表达式匹配与拆分相同的字符串的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式将字符串拆分为 char 但具有最大大小

Java 和 C# 正则表达式不产生相同的结果

C# 正则表达式拆分为 Java 模式拆分

正则表达式 - 匹配相同模式的组

正则表达式与 C# 中的 OR 条件最长匹配

C# 正则表达式 Replace的功能