每个文字上的Regex.Split字符串(包含在结果中)

时间:2013-04-08 19:23:47

标签: regex c#-4.0

string s = "123wWdf4d556e";
拆分后的

应该是:

"123", "w", "W", "d", "f", "4", "d", "556", "e"

逻辑是:拆分为每个整数和单个字符。

我尝试过类似的东西,但它不起作用。解释会很好,所以我可以理解为什么它不起作用。 :)

string[] result = Regex.Split(s, "\w+(?=[a-zA-Z]");

修改:修改了上述结果。

2 个答案:

答案 0 :(得分:4)

在后面使用look-

string[] result = Regex.Split(s, "(?<=[a-zA-Z])");

你的工作不起作用,因为你试图拆分单词字符,并且在拆分过程中,这些字符将从结果中删除。可以这样想:当你在逗号上拆分CSV字符串时,结果中是否保留了逗号?你的尝试也发生了同样的事情。

使用断言,就像你正在尝试以及我正在显示的内容一样,因为它类似于分裂你正在寻找的角色旁边的空白。这是因为断言是“零宽度” - 它们不消耗任何东西。所以上面的模式基本上说,“分裂在字母字符之后的空白。”

根据您的编辑,您可以使用相同的概念,但稍微扩展一下:

string[] result = Regex.Split(s, @"(?<=\d)(?=[a-zA-Z])|(?<=[a-zA-Z])(?=\d)|(?<=[a-zA-Z])(?=[a-zA-Z])");

您可以使用替换(|)来设置要拆分的变体:整数后跟一个字母((?<=\d)(?=[a-zA-Z]));字母后跟一个整数((?<=[a-zA-Z])(?=\d));任意两个连续的字母((?<=[a-zA-Z])(?=[a-zA-Z]))。每个变体都使用断言来分割目标字符之间的空隙。使用lookbehind和lookahead的组合可以分割出这个确切的空白。

答案 1 :(得分:0)

更新:这适用于匹配,而非拆分

如果使用'ignore case'标志(i),则以下正则表达式将起作用。

\d*[a-z]

<强>解释

你的正则表达式贪婪地捕获了所有的单词,直到它后面跟着一封信。自从你使用前瞻后,它没有抓住这封信。

我的正则表达式捕获所有数字(如果有)和数字后面的第一个字母。您可以在www.debuggex.com上看到它的实际效果。请注意,已捕获f,您从预期结果中省略了该{{1}}。我认为这是一个错误。