正则表达式匹配阿拉伯语关键字

Regex match Arabic keyword

我有一个简单的正则表达式,可以在文本中找到一些词:

var patern = new RegExp("\bsomething\b", "gi");

此匹配文本中带有空格或标点符号的单词。

因此匹配:

I have something.

但不匹配:

I havesomething.

什么是好的,正是我需要的。

但我对阿拉伯语等语言有疑问。如果我有正则表达式:

var patern = new RegExp("\bرياضة\b", "gi");

和文字:

رياضة أنا أحب رياضتي وأنا سعيد حقا هنا لها حبي 

我要找的关键词在文末

但这不管用,就是找不到。

如果我从正则表达式中删除 \b,它会起作用:

var patern = new RegExp("رياضة", "gi");

但这就是我现在想要的,因为如果它是另一个词的一部分,我不想找到它,就像上面的英语示例:

 I havesomething.

所以我对正则表达式的了解真的很少,如果有人可以帮助我用英语和阿拉伯语等语言来解决这个问题。

这不起作用,因为正则表达式引擎不支持阿拉伯语。 您可以在文本中搜索 unicode 字符 (Unicode ranges).

或者您可以使用 encoding 将文本转换为 unicode,然后以某种方式制作正则表达式(我从未尝试过,但它应该可以工作)。

我们首先要明白\b是什么意思:

\b is an anchor that matches at a position that is called a "word boundary".

在您的情况下,您要查找的单词边界没有其他阿拉伯字母。

为了仅匹配正则表达式中的阿拉伯字母,我们使用 unicode:

[\u0621-\u064A]+

或者我们可以直接使用阿拉伯字母

[ء-ي]+

上面的代码将匹配任何阿拉伯字母。要从中创建单词边界,我们可以简单地在两侧反转它:

[^ء-ي]ARABIC TEXT[^ء-ي]

上面的代码意味着:不要匹配适合您的情况的阿拉伯语单词两侧的任何阿拉伯语字符。

考虑一下你给我们的这个例子,我稍微修改了一下:

 أنا أحب رياضتي رياض رياضة رياضيات وأنا سعيد حقا هنا 

如果我们只想匹配 رياض,这个词将使我们的搜索也匹配 رياضةرياضياترياضتي。但是,如果我们添加上面的代码,匹配将仅在 رياض 上成功。

var x = " أنا أحب رياضتي رياض رياضة رياضيات وأنا سعيد حقا هنا ";
x = x.replace(/([^ء-ي]رياض[^ء-ي])/g, '<span style="color:red"></span>');
document.write (x);

如果您想用一个代码来解释 أآإا,您可以使用类似这样的代码 [\u0622\u0623\u0625\u0627] 或简单地将它们全部列在方括号 [أآإا] 中。这是完整的代码

var x = "أنا هنا وانا هناك .. آنا هنا وإنا هناك";
x = x.replace(/([أآإا]نا)/g, '<span style="color:red"></span>');
document.write (x);

注意:如果要匹配正则表达式中所有可能的阿拉伯字符,包括所有阿拉伯字母أ ب ت ث ج、所有变音符号َ ً ُ ٌ ِ ٍ ّ和所有阿拉伯数字١٢٣٤٥٦٧٨٩٠,使用这个正则表达式:[،-٩]+

有用link关于阿拉伯字符在Unicode中的排名:https://en.wikipedia.org/wiki/Arabic_script_in_Unicode

如果您不需要复杂的正则表达式(例如,因为您正在寻找一个特定的单词或一个简短的单词列表),那么我发现将搜索文本标记化实际上更容易,并且那样找到它:

    >>> text = 'رياضة أنا أحب رياضتي وأنا سعيد حقا هنا لها حبي '
    >>> tokens = text.split()
    >>> print(tokens)
    ['رياضة', 'أنا', 'أحب', 'رياضتي', 'وأنا', 'سعيد', 'حقا', 'هنا', 'لها', 'حبي']
    >>> search_words = ['رياضة', 'رياضت']    
    >>> found = [w for w in tokens if w in search_words]                                  
    >>> print(found) 
    ['رياضة']  # returns only full-word match

我确定这比 RegEx 慢,但还不够我注意到。

如果您的文本有标点符号,您可以使用 NLTK 进行更复杂的标记化(因此它会找到像“бياض₩؟”这样的东西)。

我用过这个ء-ي٠-٩,它对我有用