正则表达式初始化问题
Posted
技术标签:
【中文标题】正则表达式初始化问题【英文标题】: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)。我做错了什么?
【问题讨论】:
【参考方案1】:问题大概出在这里:
?-'
这被解释为从字符 ?
到字符 '
的范围,这是无效的,因为 ?
的代码点为 63,而 '
的代码点为 39。范围应该从低到高的。但是您可能不打算在这里设置范围。我想您打算使用连字符。
要修复错误,请尝试转义连字符:
?\\-'
错误信息指示符出现在错误位置的原因是因为正则表达式中的\r
。如果您用另一个字符替换换行符,则指示符与不正确的范围对齐:
您也可以使用\\r
代替\r
,以便正确打印错误消息。
【讨论】:
re:您的编辑——我原本打算让正则表达式允许换行符,但您的回答似乎表明,我没有让正则表达式允许回车符,而是在正则表达式本身。这是真的吗,还是正则表达式会正确找到回车? 当您以 Java 字符串文字的形式创建正则表达式时,您可以采用任何一种方式。源代码中的\r
成为编译类中的回车符,正则表达式编译器将其视为任何其他文字字符。另一方面,\\r
变为 \r
,即用于回车的 regex。换句话说,\r
不会在正则表达式中引起问题,只是在错误消息中。
顺便说一句,字符类简写\s
等同于[\x20\t\r\n\f\v]
,所以你的正则表达式中的\r
无论如何都是多余的。以上是关于正则表达式初始化问题的主要内容,如果未能解决你的问题,请参考以下文章