最近看到了一种新的字符串切分方法,就是使用Intl.Segmenter将emoji字符串切分为glyphs的方法。这个Intl对象我以前没有用过,现在来看看吧。假设您想将用户输入拆分成句子,这似乎是一个简单的split()任务……但是这个问题有很多细微差别。'你好!Howareyou?'.split(/[.!?]/);//['Hello','Howareyou','']使用split()会丢失定义的分隔符,所有地方都包含这些空格.而且因为它依赖于硬编码的分隔符,所以它对语言不敏感。我不懂日语,但你会如何尝试将下面的字符串拆分成单词或句子?//我是一只猫。我的名字是Tanuki。'我辈は猫である。在はたぬき之前的名字。'普通的字符串方法在这里没有用,但是IntlJavaScriptAPI确实解决了这个问题。Intl.Segmenter来拯救Intl.Segmenter是一个JavaScript对象,用于文本的语言环境敏感分割。它帮助我们从字符串中提取有意义的项目,例如单词、句子或字形。它的用法和其他构造函数类似,可以使用new关键字来创建一个Intl.Segmenter对象。constsegmenter=newIntl.Segmenter(locale,{granularity:"word"});在上面的代码中,locale是一个字符串,表示要使用的语言环境。granularity是一个字符串,指示段的粒度。它可以是“字形”(grapheme)、“词”(word)或“句子”(sentence)之一。Intl.Segmenter有一个名为segment()的有用方法,可将文本拆分为有意义的片段。constsegments=segmenter.segment(text);在上面的代码中,text是要拆分的文本,segments是返回的段的迭代器。您可以使用for-of循??环遍历段,或使用Array.from()将它们转换为数组。consttext="你好,世界!你今天好吗?";常量分段器=新国际。分段器(“en-US”,{粒度:“句子”});const段=分段器。段(文本);for(constsegmentofsegments){console.log(segment);}//Output://{index:0,value:"Hello,world!",breakType:"",breakIndex:12}//{index:13,value:"Howareyoutoday?",breakType:"",breakIndex:31}Intl.Segmenter对象还有一些其他有用的方法,例如breakType,用于检索段的类型(例如是否是句子的结尾)包含句点)。另一个有用的方法是breakType,用于检索段的类型。例如:consttext="Hello,world!你今天好吗?";constsegmenter=newIntl.Segmenter("en-US",{granularity:"sentence"});constsegments=segmenter.segment(text);for(constsegmentofsegments){console.log(segment.breakType);}//Output://"exclamation"//"question"Intl.Segmenter还有一个有用的静态方法叫做supportedLocalesOf(),它可以帮助你确定浏览器是否支持特定区域设置。constsupported=Intl.Segmenter.supportedLocalesOf(["en-US","zh-CN"]);console.log(supported);//Output://['en-US','zh-CN']在上面的代码中,supported数组包含浏览器支持的语言环境。如果你想要更细粒度的文本分割,你可以使用Intl.ListFormat对象。它可以帮助您将文本拆分为有意义的列表项。用法与Intl.Segmenter类似,可以使用new关键字创建一个Intl.ListFormat对象。constlistFormat=newIntl.ListFormat(locale,{style:"long",type:"conjunction"});在上面的代码中,locale是一个字符串,表示要使用的语言环境。样式和类型是指定列表格式的对象的属性。style可以是“long”或“short”,type可以是“conjunction”(tie)或“disjunction”(or)。Intl.ListFormat有一个名为format()的有用方法,可将数组转换为有意义的列表。constlist=["苹果","香蕉","橙子"];const格式化=listFormat.format(列表);控制台日志(格式化);//Output://"apple,banana,andorange"ontop代码中,格式化为转换后的列表字符串。Word的粒度有一个额外的isWordLike属性。如果将字符串拆分为单词,则所有段都包含空格和换行符。使用isWordLike属性将它们过滤掉。constsegmenterDe=newIntl.Segmenter('de',{granularity:'word'});constsegmentsDe=segmenterDe.segment('Wasgehtab?');console.log([...segmentsDe]);//[//{segment:'Was',index:0,input:'Wasgehtab?',isWordLike:true},//{segment:'',索引:3,输入:'Wasgehtab?',isWordLike:false},//...//]console.log([...segmentsDe].filter(s=>s.isWordLike));//[//{segment:'Was',index:0,input:'Wasgehtab?',isWordLike:true},//{segment:'geht',index:4,input:'Wasgehtab?',isWordLike:true},//{segment:'ab',index:9,input:'Wasgehtab?',isWordLike:true}//]通过上面的isWordLike过滤会去除标点符号,比如.,-,or?.使用Intl.Segmenter分割表情符号Intl.Segmenter也是一个很大的帮助,如果你想将字符串分割成视觉表情符号。const表情符号='
