我有简单的正则表达式,它在文本中找到了一些单词:
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.
所以我对正则表达式的了解很少,如果有人能帮助我用英语和阿拉伯语等语言来帮助我。
答案 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;
如果您想使用一个代码来说明أآإا
,可以使用类似[\u0622\u0623\u0625\u0627]
之类的内容,或者只是在方括号[أآإا]
之间列出它们。这是一个完整的代码
var x = "أنا هنا وانا هناك .. آنا هنا وإنا هناك";
x = x.replace(/([أآإا]نا)/g, '<span style="color:red">$1</span>');
document.write (x);
&#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进行更复杂的标记化(这样会发现诸如“رياضة?”之类的东西)。