1

这个问题的“棘手”部分是我所说的字母不仅仅是26个字符。它还应该包括任何字母,包括重音字符和希伯来语的 alibeth 等。

为什么我需要它们?

我想将文本拆分为单词。

像拉丁字母、希伯来的 alibeth、阿拉伯的 abjads 等字母由空格分隔。

汉字是一无所有的。

所以我认为我应该用任何不是字母的东西来分隔文本。

换句话说,a、b、c、d、é 都可以。

駅,南,口,第,自,転,车.,3,5,6 不是,所有这些分隔符都应该是它自己的话。或者类似的东西。

简而言之,我想检测一个字符本身是否是一个单词,或者可以是一个单词的一部分

我尝试了什么?

好吧,您可以在这里查看我很久以前提出的问题: 如果某些字符是中文,我们如何将 utf-8 字符分成单词?

我在那里实现了唯一的答案,但后来我发现汉字没有分开。为什么不根据无分裂?好吧,这意味着字母表也被拆分了。

如果所有这些字母“粘”在一起,我可以根据 UTF 将它们分开,那也很好。

如果某些字符是中文,我将只使用如何将 utf-8 字符分成单词的答案? 并“拉出”所有非字母字符。

不是一个完美的解决方案,但对我来说已经足够了,因为西方字符和中文字符很少出现在同一个文本上。

4

2 回答 2

1

也许您不应该使用正则表达式来执行此操作,而应使用良好的旧字符串索引扫描。

希伯来文、中文、韩文等字母都在 unicode 代码点的连续范围内。因此,您可以通过读取字符的 unicode 值然后检查它属于哪个 unicode 块来轻松检测字母表。

于 2012-10-08T10:47:34.550 回答
1

Jan Goyvaerts(PowerGrep 的名人)曾经向我展示了这个非常有用的语法来做到这一点:

(?<![\p{M}\p{L}])word(?![\p{M}\p{L}])

此表达式使用正则表达式lookbehind 和正则表达式lookahead 来确保单词的边界使得两边都没有字母或变音符号。

为什么这个正则表达式比简单地使用“\b”更好?这个正则表达式的优势在于合并了 \p{M} 以包含变音符号。当使用正常的单词边界标记 (\b) 时,正则表达式引擎会在许多变音符号的位置找到断词,即使变音符号实际上是单词的一部分(例如,希伯来语变音符号就是这种情况。对于举个例子,以希伯来语单词 גְּבוּלוֹת 为例,并在其上运行“\b.”的正则表达式 - 你会看到它实际上是如何在每个变音点将单词分解成单词的不同部分)。上面的正则表达式通过使用 Unicode 字符类来解决这个问题,以确保变音符号始终被视为单词的一部分,并且不会在单词中中断。

于 2012-10-12T09:21:54.503 回答