首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将英文字母、数字和汉字分开?

如何将英文字母、数字和汉字分开?
EN

Stack Overflow用户
提问于 2015-07-04 22:42:21
回答 1查看 2K关注 0票数 0

为了更好地说明这个问题,我将列出几个输入和期望的输出:

  • 输入1:这个中文5142
  • 输出1:数组(‘This’,'中文','5142')
  • 输入2:This中文,5142
  • 输出2:数组(‘This’,'中文','5142')

因此,基本上,输入字符串可以有空格,也可以没有空格,英文字母、数字和汉字的顺序是未知的,可以不止一次出现。

我发现这个可以在没有汉字的情况下完成工作(参考:Splitting string containing letters and numbers):

代码语言:javascript
复制
$array = preg_split("/(,?\s+)|((?<=[a-z])(?=\d))|((?<=\d)(?=[a-z]))/i", $str);

我可以大致理解上面的正则表达式:

  1. (,?\s+) -被空格分隔
  2. (?<=a)(?=\d)--如果一个数字紧跟在字母后面,将它们分开
  3. (?<=\d)(?=a-z) --如果一个字母紧跟在一个数字后面,那么将它们分开。

所以我天真地这样想:我总共需要做3件事:

  1. 如果一个数字紧跟在一个字母或汉字后面,那么把它们分开。
  2. 如果一个字母紧跟在一个数字或汉字后面,那么把它们分开。
  3. 如果一个汉字紧跟在一个字母或数字后面,那么把它们分开。

为了达到一个目标,我想:

代码语言:javascript
复制
(?<=[a-z\x4E00-\x9FA5])(?=\d)

其中\x4E00-\x9FA5与汉字匹配。但这不管用!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-04 22:51:22

要以显式的方式这样做,您可以使用:

代码语言:javascript
复制
$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可能会给出同样的结果,只需花费较少的精力:

代码语言:javascript
复制
if (preg_match_all('~\p{Latin}+|\p{Han}+|[0-9]+~u', $str, $matches))
    $result = $matches[0];

U修饰符强制正则表达式引擎将字符串作为UTF8字符串读取。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31225669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档