首页 > 解决方案 > 如果最后一个字符已否定集,则加量词不检查最后一个字符

问题描述

我需要匹配具有以下约束的字符串:

  1. 至少一个字母数字字符
  2. 禁止特定字符 (^*@:;)
  3. 禁止点在最后

我有下一个模式:

^[^*@:;]*[\p{Alnum}]+[^*@:;]*[^.*@:;]$

问题是当我最后有一个字母数字字符时,字符串将与模式不匹配。

例如:

$$$....1$将匹配模式。

$$$....$1将不会。

据我了解,问题在于[\p{Alnum}]+不检查最后一个字符。

有没有可能用一个正则表达式来做到这一点?

标签: javaregexregex-negation

解决方案


似乎以下内容应该勾选您的框:

^(?=.*\p{Alnum})(?!.*[*@:;]).+(?<!\.)$

在哪里:

  • ^- 开始字符串锚。
  • (?=.*\p{Alnum})- 正向前瞻以匹配至少一个字母数字字符。
  • (?!.*[*@:;])- 负前瞻以防止字符类中提到的任何字符。
  • .+- 除换行符之外的 1+ 个字符。
  • (?<!\.)- 负向后看以防止前面出现点;
  • $- 结束字符串锚。

查看在线演示


或者使用否定的字符类,而不是否定的前瞻:

^(?=.*\p{Alnum})[^*@:;\n]+(?<!\.)$
  • ^- 开始字符串锚。
  • (?=.*\p{Alnum})- 正向前瞻以匹配至少一个字母数字字符。
  • [^*@:;\n]+- 除了字符类中提到的字符之外的 1+ 个字符。
  • (?<!\.)- 负向后看以防止前面出现点;
  • $- 结束字符串锚。

查看在线演示


推荐阅读