【问题标题】:Regex Initialization problems正则表达式初始化问题
【发布时间】:2011-07-10 17:00:37
【问题描述】:

我正在处理一些遗留代码,并且我正在尝试将一个新的正则表达式添加到验证器的枚举器中,用于我们标记为“URL”的目的。据我了解,枚举器的每个部分都可以调用到一个单独的正则表达式中。无论如何,这就是我所得到的(以及其他人跟随,因此尾随逗号):

URL("[a-zA-Z0-9\r#;?-\'.:,!/\\s]{1,250}", "Up to 250 letters (upper and lower case), numbers, #, ;, ?, -, ', ., :, comma, !, /, blankspace and carriage return"),

我做了一个简单的 JUnit 测试,看看它是否工作正常。不是。

Caused by: java.util.regex.PatternSyntaxException: Illegal character range near index 15
[a-zA-Z0-9
#;?-'.:,!/\s]{1,250}
               ^

我试图将 URL 类型的输入限制在 1 到 250 个字符之间,这是我认为我正在做的,但 Eclipse 似乎对这个逗号感到不快(我假设逗号是索引 15)。我做错了什么?

【问题讨论】:

    标签: java regex eclipse


    【解决方案1】:

    问题大概出在这里:

    ?-'
    

    这被解释为从字符 ? 到字符 ' 的范围,这是无效的,因为 ? 的代码点为 63,而 ' 的代码点为 39。范围应该从低到高的。但是您可能不打算在这里设置范围。我想您打算使用连字符。

    要修复错误,请尝试转义连字符:

    ?\\-'
    

    错误信息指示符出现在错误位置的原因是因为正则表达式中的\r。如果您用另一个字符替换换行符,则指示符与不正确的范围对齐:

    [a-zA-Z0-9_#;?-'.:,!/\s]{1,250} ^

    您也可以使用\\r 代替\r,以便正确打印错误消息。

    【讨论】:

    • re:您的编辑——我原本打算让正则表达式允许换行符,但您的回答似乎表明,我没有让正则表达式允许回车符,而是在正则表达式本身。这是真的吗,还是正则表达式会正确找到回车?
    • 当您以 Java 字符串文字的形式创建正则表达式时,您可以采用任何一种方式。源代码中的\r 成为编译类中的回车符,正则表达式编译器将其视为任何其他文字字符。另一方面,\\r 变为 \r,即用于回车的 regex。换句话说,\r 不会在正则表达式中引起问题,只是在错误消息中。
    • 顺便说一句,字符类简写\s 等同于[\x20\t\r\n\f\v],所以你的正则表达式中的\r 无论如何都是多余的。
    猜你喜欢
    • 2021-07-14
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    相关资源
    最近更新 更多