string s = "123wWdf4d556e";
拆分后的应该是:
"123", "w", "W", "d", "f", "4", "d", "556", "e"
逻辑是:拆分为每个整数和单个字符。
我尝试过类似的东西,但它不起作用。解释会很好,所以我可以理解为什么它不起作用。 :)
string[] result = Regex.Split(s, "\w+(?=[a-zA-Z]");
修改:修改了上述结果。
答案 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}}。我认为这是一个错误。