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

时间:2016-11-21 23:07:02

标签: javascript regex arabic arabic-support

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

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.

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

3 个答案:

答案 0 :(得分:5)

我们首先要了解\b的含义:

  

\ b是一个匹配在一个名为"字边界"的位置的锚。

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

为了匹配Regex中的阿拉伯字母,我们使用unicode:

[\u0621-\u064A]+

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

[ء-ي]+

上面的代码将匹配任何阿拉伯字母。为了使它成为一个单词边界,我们可以简单地在两边反转它:

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

上面的代码表示:不要匹配阿拉伯语单词两侧的任何阿拉伯字符,这些字符对您的情况有效。

考虑一下这个例子,你给了我一些我修改过的东西:

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

如果我们仅尝试匹配رياض,则此字词也会使我们的搜索匹配رياضةرياضياترياضتي。但是,如果我们添加上述代码,则匹配将仅成功رياض



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

如果您想使用一个代码来说明أآإا,可以使用类似[\u0622\u0623\u0625\u0627]之类的内容,或者只是在方括号[أآإا]之间列出它们。这是一个完整的代码

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

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

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

答案 1 :(得分:0)

由于正则表达式引擎不支持阿拉伯语,因此无法正常工作。 您可以在文本中搜索unicode字符(Unicode ranges)。

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

答案 2 :(得分:0)

如果您不需要复杂的RegEx(例如,因为您要查找特定的单词或一小段单词),那么我发现标记化搜索文本并找到它实际上更容易这样:

    >>> 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进行更复杂的标记化(这样会发现诸如“رياضة?”之类的东西)。