大家好,我叫ConardLi。假设我们现在有这样一个需求,将一段话拆分成有意义的句子:你好,我是ConardLi。我来了!你是谁?你在哪里?你第一时间可能会觉得用split来划分所有可能的标点符号就够了,比如下面的代码:vartxt='你好,我是ConardLi。我来了!你是谁?你在哪里?'txt.split(/[.?!]/);//['Hi,I'mConardLi','I'mhere','Whoareyou','Whereareyou','']看起来结果还不错,但是这三个中文标点符号是唯一的吗那些可以打破句子的?显然不是,如果我们要处理更复杂的文本,就需要继续提高这个正则性。另外,这种切分最大的问题是标点符号会在切分结果中丢失。如果我们想按单词而不是句子拆分怎么办?如果我们要拆分的文本是英文或阿拉伯文怎么办...//Chineseconstcn='Hello,I'mConardLi.我来了!你是谁?你在哪里?';//英文consten='你好,我是ConardLi。我来了!你是谁?你在哪里?';//阿拉伯语constar='?????????????????.啊啊啊啊!?????????????';这时候,分裂可能是表达无能为力!IntlAPIIntl是ECMAScript国际化API的一个命名空间,它提供了精确的字符串比较、数字格式化以及日期和时间格式化功能。今天就来看看它提供的字符串切分能力吧!Intl.Segmenter对象专为语言敏感的文本分割而设计。它允许您将字符串分割成有意义的片段(单词、单词、句子)。我们来看看它对以上三种语言的分词结果:Chineseconstsegmenter=newIntl.Segmenter('zh',{granularity:'sentence'});console.log(Array.from(segmenter.segment(Hi,我是ConardLi。我来了!你是谁?你在哪儿?),s=>s.segment));//['嗨,我是ConardLi。','我来了!','你是谁?','你在哪里?']Englishconstsegmenter=newIntl.Segmenter('en',{granularity:'sentence'});console.log(Array.from(segmenter.segment(`你好,我是ConardLi。我来了!你是谁?你在哪里?`),s=>s.segment));//["你好,我是ConardLi。”,“我来了!”,'你是谁?','你在哪里?']阿拉伯语constsegmenter=newIntl.Segmenter('ar',{granularity:'sentence'});console.log(Array.from(segmenter.segment(`??????????????????.???????!???????????`),s=>s.segment));//['?????????????????.','???????!','??????','???????']国际兼容性也不错,只是火狐目前不支持,其他主流浏览器都已经支持了。让我们来看看Intl.Segmenter的一些细节。构造参数在上面的例子中,我们在Intl.Segmenter的构造函数中传递了两个参数。第一个参数是语言地区代码,结构为:'语言代码-地区代码',因为同一种语言在不同地区可能不一样,比如下面一些常见的例子:zh:中文zh-CN:简体中文zh-HK:香港中文(繁体中文)en:英文en-US:美式英语en-CB:英式英语第二个参数是一些更详细的配置参数,我们主要关注粒度,它有三个值,分别表示我们想把字符串分割成句子、单词或单词:constsegmenter=newIntl.Segmenter('zh',{granularity:'sentence'}//sentence);//['你好,我是ConardLi.','我来了!','你是谁?','你在哪里?']constsegmenter=newIntl.Segmenter('zh',{granularity:'word'}//word);//['你好',',','我是','','ConardLi','.','我来了','!','你是谁','?','你在哪','?']constsegmenter=newIntl.Segmenter('zh',{granularity:'grapheme'}//词);//['你','好',',','我','是',''、'C'、'o'、'n'、'a'、'r'、'd'、'L'、'i'、'。','我来了','!','你是谁','?','你在哪','?']返回值可以在上面的例子中找到,我们使用Array.from来处理段的返回值:是谁?你在哪里?),s=>s.segment));这是因为它返回的不是一个数组,而是一个可迭代对象。如果我访问里面的字段,我可以使用for-of或使用Array.from函数转换为数组。constsegmenter=newIntl.Segmenter('zh',{granularity:'sentence'});constsegments=segmenter.segment('...');//结构转换为数组console.log([...segments]);//Array.from转为数组console.log(Array.from(segments));//for-of遍历for(letsegmentofsegments){console.log(segment);}完成返回值包括被切分的字符、字符位置和完整的输入内容:另外,在前面的例子中,当我们将文本切分成单词时,可以发现标点符号、空格等都被切分了:constsegmenter=newIntl.Segmenter('zh',{granularity:'word'}//word);constresult=segmenter.segment(`你好,我是ConardLi。','我来了!','你是谁?','在哪里你是吗?`)Array.from(result,s=>s.segment)//['你好',',','我是','','ConardLi','.','我来了','!','你是谁','?','你在哪','?']此时返回值还会包含一个isWordLike属性,可以用来过滤是否真的是一个词:Array.from(result).filter(s=>s.isWordLike).map(s=>s.segment)//['你好','我是','ConardLi','我在这里','是','你是','谁','你是','在哪里']handleemojis一般我们要处理如果文本中包含emojis,问题可能会变得麻烦...看下面的例子:conststr1='12345';conststr2='12345
