如果最后一个字符有否定集,加量词不检查最后一个字符

Plus quantifier does not check the last character if last character has negated set

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

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

我有下一个模式:

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

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

例如:

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

$$$....不会。

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

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

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

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

其中:

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

在线查看demo


或者像您一样使用否定字符 class 而不是否定前瞻:

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

在线查看demo