【问题标题】:Plus quantifier does not check the last character if last character has negated set如果最后一个字符已否定集,则加量词不检查最后一个字符
【发布时间】:2021-06-01 23:50:05
【问题描述】:

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

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

我有下一个模式:

^[^*@:;]*[\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


【解决方案1】:

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

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

地点:

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

在线查看demo


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

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

在线查看demo

【讨论】:

  • 注意:如果使用matches(),则不需要开始/结束锚点(以及使用支持 Java 正则表达式的在线引擎的额外 +1(如果可以的话))
猜你喜欢
  • 1970-01-01
  • 2017-10-30
  • 2020-01-27
  • 1970-01-01
  • 1970-01-01
  • 2017-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多