为了更好地说明这个问题,我将列出几个输入和期望的输出:
因此,基本上,输入字符串可以有空格,也可以没有空格,英文字母、数字和汉字的顺序是未知的,可以不止一次出现。
我发现这个可以在没有汉字的情况下完成工作(参考:Splitting string containing letters and numbers):
$array = preg_split("/(,?\s+)|((?<=[a-z])(?=\d))|((?<=\d)(?=[a-z]))/i", $str);我可以大致理解上面的正则表达式:
所以我天真地这样想:我总共需要做3件事:
为了达到一个目标,我想:
(?<=[a-z\x4E00-\x9FA5])(?=\d)其中\x4E00-\x9FA5与汉字匹配。但这不管用!
发布于 2015-07-04 22:51:22
要以显式的方式这样做,您可以使用:
$result = preg_split('~(?<!\p{Latin})(?=\p{Latin})|(?<!\p{Han})(?=\p{Han})|(?<![0-9])(?=[0-9])~u', $str, -1, PREG_SPLIT_NO_EMPTY);(将每个边界上的字符串拆分)。注意,如果您只有三种类型的字符,您可以删除其中一个边界(一个您想要的)。
如果要从结果中删除空白,可以将所有内容放入一个非捕获组中,并在模式的开头添加\s*。
然而,使用preg_match_all可能会给出同样的结果,只需花费较少的精力:
if (preg_match_all('~\p{Latin}+|\p{Han}+|[0-9]+~u', $str, $matches))
$result = $matches[0];U修饰符强制正则表达式引擎将字符串作为UTF8字符串读取。
https://stackoverflow.com/questions/31225669
复制相似问题