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

2022-09-03 05:12:36

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

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

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

但是,通过使用不仅所有阿拉伯语(波斯语)字母都会被接受,而且阿拉伯数字也是可以接受的,比如۱۲。[\\p{InArabic}]+$

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

请注意,波斯语(阿拉伯语)数字是这样的:۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۰


答案 1

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

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

\p{InArabic}匹配 Unicode 块阿拉伯语中的任何字符(从 U+0600 到 U+06FF)

\PN匹配不属于任何“数字”类别的任何字符(请注意大写字母)。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]"));
}

答案 2

您可以使用字符类减法,这是一个相当晦涩的功能:

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

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