Regex non-consecutive chars

后端 未结 4 1164
别那么骄傲
别那么骄傲 2021-01-06 17:32

Currently I have:

[A-Za-z0-9._%+-]

This matches any string that contains letters, numbers, and certain special chars (._%+-)

相关标签:
4条回答
  • 2021-01-06 17:41

    Using PHP's PCRE, you can do this:

    /^([A-Za-z0-9]|([._%+-])(?!\2))*$/
    

    The \2 is the back-reference that's required to detect a duplicate usage of the same symbol. I'm not sure it's possible to do this without a forward assertion and a back-reference, so there is my working regex tested against:

    'foo'         => true,
    'bar.baz'     => true,
    'bar.biz.buz' => true,
    'bar.+bar'    => true,
    'bar..bar'    => false,
    'biz.baz..'   => false,
    '..++..'      => false,
    '.faf.'       => true,
    
    0 讨论(0)
  • 2021-01-06 17:43

    If your tool/language supports look aheads, try:

    ^(?!.*([._%+-])\1)[A-Za-z0-9._%+-]+$
    
    0 讨论(0)
  • 2021-01-06 17:44
    ^(?:[0-9A-Za-z]+|([._%+-])(?!\1))+$
    

    Broken down:

    • (?:)+ — one or more of either:
      • [0-9A-Za-z]+ — one or more alphanumeric characters or
      • ([._%+-]) — any allowed non-alphanumeric
        • (?!\1) — which isn't followed by the exact same character

    Allows:

    • foo
    • foo.+bar
    • -700.bar+baz

    Disallows:

    • foo..bar
    • foo.+bar--baz

    It works by capturing the matched non-alphanumeric characters into the first backreference (\1) each time the outer, not capturing group is matched and using a negative look-ahead ((?!)) to make sure the same character doesn't appear twice in a row. Be aware that not all regex flavors support negative look-ahead!

    0 讨论(0)
  • 2021-01-06 17:59

    How about this:

    ^(?!.*[._%+-]{2})[\w.%+-]+$
    

    If only the same character cannot be repeated then use:

    ^(?!.*([._%+-])\1)[\w.%+-]+$
    
    0 讨论(0)
提交回复
热议问题