正则表达式初始化问题

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。如果您用另一个字符替换换行符,则指示符与不正确的范围对齐:

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

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

【讨论】:

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

以上是关于正则表达式初始化问题的主要内容,如果未能解决你的问题,请参考以下文章

java 正则怎么匹配符号加中文

java 正则匹配字符是不是为纯数字

Grafana - 在查询中使用自定义变量作为正则表达式

初始正则表达式

正则表达式等价

leetcode 10.正则表达式