14

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

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.

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

4

4 回答 4

22

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

\b 是在称为“单词边界”的位置匹配的锚点。

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

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

[\u0621-\u064A]+

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

[ء-ي]+

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

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

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

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

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

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

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

如果你想أآإا用一个代码来解释,你可以使用这样的东西,[\u0622\u0623\u0625\u0627]或者简单地在方括号之间列出它们[أآإا]。这是一个完整的代码

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

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

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

于 2016-11-22T01:28:03.227 回答
1

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

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

于 2016-11-21T23:24:52.327 回答
0

如果您不需要复杂的正则表达式(例如,因为您要查找特定单词或单词的简短列表),那么我发现标记搜索文本并以这种方式查找实际上更容易:

    >>> 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 进行更复杂的标记化(因此它会找到像 'رياضة؟' 这样的东西)。

于 2020-05-04T11:59:03.387 回答
0

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

于 2022-01-14T19:55:46.767 回答