没有任何数字的波斯语(阿拉伯语)字母的正则表达式

Regular expression for persian(arabic) letters without any numbers

在 Java 中,我正在寻找一个正则表达式,它接受除任何波斯(或阿拉伯)数字之外的任何波斯(或阿拉伯)字母。 为了只有字母,我找到了一个非常好的正则表达式:

[\u0600-\u065F\u066A-\u06EF\u06FA-\u06FF]

虽然这是真的并且对我有用,但我们知道我们可以使用 \p{L}+ 作为正则表达式,它接受来自世界上所有语言的所有字母,在我的例子中(阿拉伯语 - 波斯语) 我可以修改它并使用 [\p{InArabic}]+$.

但是通过使用 [\p{InArabic}]+$,不仅所有阿拉伯(波斯)字母都将被接受,而且阿拉伯数字也将被接受,例如 12。

所以我的问题是如何修改 [\p{InArabic}]+$ 以仅接受字母而不是数字,或者换句话说如何限制 [\p{InArabic}]+$ 不接受任何数字?

请注意波斯语(阿拉伯语)数字是这样的:1234567890

您可以使用 character class subtraction,这是一个相当晦涩的功能:

[\p{InArabic}&&[^۰-۹]]

工作示例:http://ideone.com/jChGem

您可以使用以下正则表达式:

"[\p{InArabic}&&\PN]"

\p{InArabic} 匹配 Unicode Block Arabic 中的任何字符(从 U+0600 到 U+06FF)

\PN 匹配任何 not 属于任何数字类别的字符(注意大写 P)。

将 2 个集合相交得到所需的结果:数字范围(U+0660 到 U+0669)和(U+06F0 到 U+06F9)都被排除在外。

测试代码

for (int i = 0x600; i <= 0x6ff; i++) {
    String c = "" + (char) i;
    System.out.println(Integer.toString(i, 16) + " " + c.matches("[\p{InArabic}&&\PN]"));
}