如何否定反向引用正则表达式

3
我正在制作一个正则表达式来验证密码,需符合以下条件:
Have at least 6 characters.
Only have alphanumeric characters.
Don't have the same initial and ending character.

我考虑让第一个和最后一个字符匹配,然后否定反向引用。我的问题在于如何否定这个反向引用。我在网上找了一些东西,但没有起作用。目前为止,我得到了以下内容:
([\w])[\w]{3}[\w]+\1 //Generates a password with at least 6 chars in which the first and final characters match

根据这个线程 - https://dev59.com/lmsz5IYBdhLWcg3wNU8R - 你需要使用负向前瞻来否定反向引用。仅供参考,你的正则表达式仅适用于恰好6个字符,但不包括至少六个字符。你的 {3} 应该是 {3,} 或者甚至是 {4,}(你可以移除最后的 [\w])。此外,你无需将 \w 放在方括号内,因为它会允许非字母数字字符(在这种情况下,是下划线 _)。 - David Faber
2个回答

3
您可以使用这个正则表达式:
^([0-9a-zA-Z])(?!.*\1$)[0-9a-zA-Z]{5,}$

正则表达式演示

  • (?!.*\1$) 确保第一个和最后一个字符不相同。
  • [0-9a-zA-Z]{5,} 确保长度至少为6,并且输入中只包含字母数字字符。

它确实可以工作,但我不知道为什么 (?!.*\1$) 会使初始和最终字符不同。 - GRoutar
1
这是一个负向先行断言 - 它确保最后一个字符与第一组捕获的字符不相同。 - David Faber
(?!.*\1$) 是一个名为“负向先行断言”的正则表达式语法,意思是如果最后一个字符与第一个字符相同,则匹配失败。 - anubhava
好的,这基本上是一个模板,例如 (?!.*<插入您不想完成的内容>$)?我试图逐个字符地理解它,以便自己能够解决。 - GRoutar

2

使用这种模式

^(?=[0-9-a-zA-Z]+$)(.).{4,}(?!\1). 

Demo


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接