这个混合字符串如何在 unicode 单词边界上拆分

Luc*_*iel 7 unicode split word-boundary rust

考虑字符串"abc?"。根据unicode的分词demo实现,这个字符串应该被拆分成两个词,"abc""?"。然而,词边界检测的 3 个不同 Rust 实现(regexunic-segmentunicode-segmentation不一致,并将该字符串分组为一个词。哪种行为是正确的?

作为后续,如果分组行为是正确的,那么以仍然主要尊重单词边界的方式扫描此字符串以查找搜索词“abc”的好方法是什么(目的是检查字符串翻译的有效性) . 我想匹配类似"abc?"但不匹配类似的东西abcdef

kmd*_*eko 3

我不太确定分词演示应该被视为事实真相,即使它是在官方网站上。例如,它认为"abc\xeb\xa5\xbc"( "abc\\uB97C") 是两个单独的单词,但认为"abc\xe1\x84\x85\xe1\x85\xb3\xe1\x86\xaf"( "abc\\u1105\\u1173\\u11af") 是一个单词,即使前者分解为后者。

\n

单词边界的想法并不是一成不变的。Unicode 有一个单词边界规范,它概述了应该和不应该出现断字的位置。然而,它有一个广泛的注释部分来阐述其他案例(重点是我的):

\n
\n

不可能提供一套统一的规则来解决跨语言的所有问题或处理给定语言内的所有歧义情况。本附件中提出的规范的目标是提供可行的默认值;定制的实施可以更加复杂。

\n

对于泰语、老挝语、高棉语、缅甸语和其他通常不在单词之间使用空格的文字,良好的实现不应依赖于默认的单词边界规范。它应该使用更复杂的机制,这也是断行所需要的。日语和汉语等表意文字更加复杂。如果韩文文本不带空格,则同样适用。然而,在缺乏更复杂的机制的情况下,本附件中指定的规则提供了明确定义的默认值。

\n

...

\n
\n

我的理解是,您列出的板条箱遵循规范,无需进一步的上下文分析。我不能说为什么演示不同意,但这可能是尝试实现这些边缘情况之一。

\n
\n

为了解决您的具体问题,我建议使用Regexwith\\b来匹配单词边界。不幸的是,这遵循相同的 unicode 规则,不会"\xeb\xa5\xbc"被视为新词。然而,这个正则表达式的实现提供了一个回退到 ascii 行为的逃生口。只需使用(?-u:\\b)来匹配非 unicode 边界:

\n
use regex::Regex;\n\nfn main() {\n    let pattern = Regex::new("(?-u:\\\\b)abc(?-u:\\\\b)").unwrap();\n    println!("{:?}", pattern.find("some abcdef abc\xeb\xa5\xbc sentence"));\n}\n
Run Code Online (Sandbox Code Playgroud)\n

您可以在操场上自己运行它来测试您的案例,看看这是否适合您。

\n