1

我有一个文本框,用户可以输入任何语言的任何文本,我需要将该文本拆分为单词,以便我可以将这些单词传递给 hunspell 拼写检查。对于拆分,我使用匹配单词分隔符的正则表达式。

起初,我用作\W单词分隔符将文本拆分为 wrod,但这仅适用于拉丁字母,例如英语。如果我使用非拉丁语言,它会将它的每个字母都视为\W. 那是因为\W被定义为任何字符,即[^a-zA-Z0-9_].

到目前为止,(?![-'])[\pP|\pZ|\pC]似乎正确地标记了英语、西班牙语和俄语。它基本上说将所有标点符号(连字符和撇号除外)、所有分隔符和所有“其他”字符(控制、私人使用等)视为单词分隔符。我已经排除了连字符和撇号,因为它们通常不应该被视为单词分隔符。

我没有对它进行太多测试,今天才想出它,所以我认为询问是否有人知道任何更适合匹配多语言文本中的单词分隔符的正则表达式是明智的。

请注意,我不关心无法标记化的语言,例如日语、中文、泰语等。

更新:由于人们问我使用的是什么语言(尽管它可能无关紧要),我正在使用 C++ 和 Qt5 的QRegularExpression类。

4

2 回答 2

2

使用 Java(例如),您可以模拟这样的单词边界(不要忘记双重转义):

(?<![\p{L}\p{N}_])[\p{L}\p{N}_]+(?![\p{L}\p{N}_])

where\p{L}匹配任何字母和\p{N}任何数字。

因此,您可以轻松地将字符串拆分为“单词”:[^\p{L}\p{N}_]+

(我不知道您使用的正则表达式风格,但您可能可以删除大括号)。

于 2014-06-07T00:43:03.277 回答
0

在 PHP 中,这应该可以工作:

[\pL]*

在 Javascript 中,您可以使用(在分隔符后为 unicode 设置“u”):

/[\p{L}]*/u
于 2021-09-17T08:40:33.133 回答