1
string s = "123wWdf4d556e";

拆分后的结果应该是:

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

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

我已经尝试过这样的事情,但它不起作用。一个解释会很好,所以我可以理解为什么它不起作用。:)

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

编辑:编辑上述结果。

4

2 回答 2

4

使用视:

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 的组合可以让您在这个确切的空白处进行拆分。

于 2013-04-08T19:29:53.830 回答
0

更新:这适用于match,而不是split

如果您使用“忽略大小写”标志 (i),则以下正则表达式将起作用。

\d*[a-z]

解释

您的正则表达式贪婪地捕获了所有单词,直到它后面跟着一个字母。由于您使用了前瞻,它没有捕获该字母。

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

于 2013-04-08T19:32:33.250 回答