【发布时间】:2021-06-01 23:50:05
【问题描述】:
我需要匹配具有以下约束的字符串:
- 至少一个字母数字字符
- 禁止使用特定字符 (^*@:;)
- 末尾禁止点
我有下一个模式:
^[^*@:;]*[\p{Alnum}]+[^*@:;]*[^.*@:;]$
问题是当我最后有一个字母数字字符时,字符串将与模式不匹配。
例如:
$$$....1$ 将匹配该模式。
$$$....$1 不会。
据我了解,问题在于[\p{Alnum}]+ 没有检查最后一个字符。
有没有办法用一个正则表达式来做到这一点?
【问题讨论】:
-
试试这个:
^(?=[^*@:;]*[a-zA-Z\d])[^^*@:;]*[^^.*@:;]$ -
有点正确,问题是
[^.*@:;]$是最后一个字符,所以[\p{Alnum}]+没有任何东西可以匹配(在第二个例子中$$$...$没有'Alnum' 匹配) (尝试不使用最后一个[^.*@:;]并为点添加负面的后视) -
目前的问题是什么?您是否在某些在线正则表达式测试站点上测试该模式并且它不起作用?否定字符类匹配换行符,因此您可能无法获得正确的测试结果,您只需在此处添加
\n。此外,如果您需要避免匹配^字符,则需要将^添加到您的否定字符类中。检查^[^^*@:;\n]*\p{Alnum}[^^*@:;\n]*[^^.*@:;\n]$是否适合您。见regex101.com/r/mCsinY/1
标签: java regex regex-negation