string s = "123wWdf4d556e";
拆分后的结果应该是:
"123", "w", "W", "d", "f", "4", "d", "556", "e"
逻辑是:拆分为每个整数和单个字符。
我已经尝试过这样的事情,但它不起作用。一个解释会很好,所以我可以理解为什么它不起作用。:)
string[] result = Regex.Split(s, "\w+(?=[a-zA-Z]");
编辑:编辑上述结果。
使用后视:
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 的组合可以让您在这个确切的空白处进行拆分。
更新:这适用于match,而不是split。
如果您使用“忽略大小写”标志 (i),则以下正则表达式将起作用。
\d*[a-z]
解释
您的正则表达式贪婪地捕获了所有单词,直到它后面跟着一个字母。由于您使用了前瞻,它没有捕获该字母。
我的正则表达式捕获所有数字(如果有)和数字后面的第一个字母。您可以在www.debuggex.com上看到它的运行情况。请注意,f
已捕获,您从预期结果中省略了它。我认为这是一个错误。