我们提供的产品需要搜索功能,并且主要针对英语。因此,在空间上进行分词的效果相对较好(尽管并非总是最好的主意)。
我们最近正在扩展到日本市场,并且发现了许多复杂因素。日语有2个关键陷阱:1)wordsCanBeStrungTogetherWithoutSpaces 2)日语使用不同的标点符号symbols
我们有一个针对1的解决方法,但是拥有一个包含数百个字符的“单词”会带来一些麻烦,因此,理想的是解决(2)。从最严格的意义上讲,我试图解决日语问题,但实际上,我希望有一种方法可以至少拆分句子,而不考虑字母。是否有一个正则表达式适合基于unicode范围进行拆分?还是需要自定义并包括每种不同的语言?
快速搜索显示https://unicodelookup.com/#full%20stop/1似乎各种“句号”都没有模式(据我所知),但是数量并不多,我可以进行匹配。我担心的是,有些极端情况我不知道。
答案 0 :(得分:1)
尝试类似的方法开始。
这个词在第1组中。
[^\pL\pN]*([\pL\pN](?:[\pL\pN_-]|(?![?.!])\pP(?=[\pL\pN\pP]))*)(?<!\pP)
https://regex101.com/r/YEgUQ3/1
解释
# Unicode
[^\pL\pN]* # Strip non-letters/numbers
( # (1 start)
[\pL\pN] # First letter/number
(?: # Word body
[\pL\pN_-] # Letter/number or '-'
| # or,
(?! [?.!] ) # ( Not Special word ending punctuation, Add more here )
\pP # Punctuation
(?= [\pL\pN\pP] ) # if followed by punctuation/letter/number
)* # Do many times
) # (1 end)
(?<! \pP ) # Don't end on a punctuation
答案 1 :(得分:0)
看来unicode类别实际上是为此而精心设计的。以下正则表达式似乎可以正常工作:
[\p{L}\p{Nd}]+
https://regex101.com/r/YEgUQ3/2
有一个简单的解释:
\p{L} matches any kind of letter from any language
\p{Nd} matches a digit zero through nine in any script except ideographic scripts
letter
显然不是严格的标点符号。表意数字似乎只是文字。