【问题标题】:Regular expression which will match if there is no repetition如果没有重复则匹配的正则表达式
【发布时间】:2013-12-08 14:57:24
【问题描述】:

如果没有字符重复 4 次或更多次,我想构造一个匹配密码的正则表达式。

我想出了一个正则表达式,如果有一个字符或一组字符重复 4 次,它将匹配:

(?:([a-zA-Z\d]{1,})\1\1\1)

只有当字符串不包含重复项时,有什么方法可以匹配吗?我尝试了Regular expression to match a line that doesn't contain a word? 中建议的方法,因为我认为正/负前瞻的某种组合会成功。但我还没有找到工作示例。

重复是指字符串中任意位置的任意数量的字符

示例 - 不应匹配

aaaaxbc

阿里巴巴

x14aaaabc

示例 - 应该匹配

abcaxaxaz

(a 出现了 4 次但没问题,我想过滤掉重复的模式)

【问题讨论】:

  • 你能用你问题中的一些例子来解释一下吗
  • 只有在字符串的后面或任何地方才考虑重复?
  • 您走在正确的轨道上:否定环顾四周通常是正则表达式中处理这种情况的方式。

标签: regex validation non-repetitive


【解决方案1】:

该链接非常有用,我可以使用它从您的原始表达式创建正则表达式。

^(?:(?!(?<char>[a-zA-Z\d]+)\k<char>{3,}).)+$ 

^(?:(?!([a-zA-Z\d]+)\1{3,}).)+$ 

REY

【讨论】:

  • 不适用于“或一组角色”的 OP 问题。放入你的小提琴:blablablabla 它会匹配。
  • 您的示例似乎运行良好。我将它更新为 ^(?:(?!([a-zA-Z\d]+)\1{3,}).)+$ 以支持多个字符的重复。谢谢
  • 我想请你解释一下\k的作用,我看不懂。我练习 Python。是另一种语言吗?
  • 是的,使用命名引用是其他风格。当我做反向引用时,我只是倾向于这样做,否则我会感到困惑。在 python 中是 (?P=name)
  • 您可能希望更新您的答案以反映 OP 的要求,以避免重复多字符序列。
【解决方案2】:

Nota Bene:这个解决方案没有准确回答问题,相对于表达的需求而言,它做得太多了。

-----

在 Python 语言中:

import re

pat = '(?:(.)(?!.*?\\1.*?\\1.*?\\1.*\Z))+\Z'

regx = re.compile(pat)

for s in (':1*2-3=4@',
          ':1*1-3=4@5',
          ':1*1-1=4@5!6',
          ':1*1-1=1@',
          ':1*2-a=14#a~7&1{g}1'):
    m = regx.match(s)
    if m:
        print m.group()
    else:
        print '--No match--'

结果

:1*2-3=4@
:1*1-3=4@5
:1*1-1=4@5!6
--No match--
--No match--

它会给正则表达式马达做很多工作,因为该模式的原理是,对于它所遍历的字符串的每个字符,它必须验证当前字符在剩余序列中的其他 3 次中都没有找到当前字符后面的字符数。
但它显然有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 2015-03-24
    • 2019-03-31
    • 1970-01-01
    相关资源
    最近更新 更多