我有一个完全正常的正则表达式,直到我将我的语言环境切换为'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)
任何帮助将不胜感激。 感谢
答案 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 + "}$");
修复了崩溃。感谢大家的贡献。