非拉丁语言环境中的PatternSyntaxException

时间:2011-07-24 23:28:20

标签: android regex locale

我有一个完全正常的正则表达式,直到我将我的语言环境切换为'fa'(波斯语)。我怀疑希伯来语和阿拉伯语也会发生这种情况(还不确定是否是字符或RTL方向使其中断)。

导致异常的代码行是:

public static final Pattern NAME_REGEX = Pattern.compile(String.format("^[\\w ]{%d,%d}$", 2,24));

(语法很好,它适用于英语和西班牙语)但是当应用程序尝试在“不兼容”语言环境中编译正则表达式时,我得到以下内容:

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.util.regex.PatternSyntaxException: Syntax error U_REGEX_BAD_INTERVAL     near index 8:
^[\w ]{٢,٢٤}$
   ^
at java.util.regex.Pattern.compileImpl(Native Method)
at java.util.regex.Pattern.compile(Pattern.java:400)
at java.util.regex.Pattern.<init>(Pattern.java:383)
at java.util.regex.Pattern.compile(Pattern.java:374)
at com.airg.hookt.config.airGConstant.<clinit>(airGConstant.java:131)

任何帮助将不胜感激。 感谢

2 个答案:

答案 0 :(得分:1)

看起来您正在尝试使用阿拉伯语 - 印度数字(U+0660..U+0669)来指定间隔;如果有效的话,我会非常惊讶。我从来没有听说过正则表达式的味道接受除了ASCII数字以外的任何东西作为正则表达式本身的一部分

您是否还期望\w匹配波斯语,希伯来语和阿拉伯语脚本中的字母/数字?这也不行,但这次是因为Java的正则表达式缺点。如果要匹配任何书写系统中的字符,则需要使用\p{L}\p{N}等Unicode属性(有关详细信息,请参阅here)。

答案 1 :(得分:0)

<强> ANSWER

所以......问题确实是String.format

更改

public static final Pattern NAME_REGEX = Pattern.compile(String.format("^[\\w ]{%d,%d}$", 2,24));

public static final Pattern NAME_REGEX = Pattern.compile("^[\\w ]{" + 2 + "," + 24 + "}$");

修复了崩溃。感谢大家的贡献。