Regex for [a-zA-Z0-9\-] with dashes allowed in between but not at the start or end

前端 未结 4 700
故里飘歌
故里飘歌 2021-02-14 12:15

Update:

This question was an epic failure, but here\'s the working solution. It\'s based on Gumbo\'s answer (Gumbo\'s was close to working so I chose it as the accepte

相关标签:
4条回答
  • 2021-02-14 13:11

    The current regex is simple and fairly readable. Rather than making it long and complicated, have you considered applying the other constraints with normal Python string processing tools?

    import re
    
    def fits_pattern(string):
        if (4 <= len(string) <= 25 and
            "--" not in string and
            not string.startswith("-") and
            not string.endswith("-")):
    
            return re.match(r"[a-zA-Z0-9\-]", string)
        else:
            return None
    
    0 讨论(0)
  • 2021-02-14 13:14

    Try this regular expression:

    ^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$
    

    This regular expression does only allow hyphens to separate sequences of one or more characters of [a-zA-Z0-9].


    Edit    Following up your comment: The expression (…)* allows the part inside the group to be repeated zero or more times. That means

    a(bc)*
    

    is the same as

    a|abc|abcbc|abcbcbc|abcbcbcbc|…
    

    Edit    Now that you changed the requirements: As you probably don’t want to restrict each hyphen separated part of the words in its length, you will need a look-ahead assertion to take the length into account:

    (?=[a-zA-Z0-9-]{4,25}$)^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$
    
    0 讨论(0)
  • 2021-02-14 13:17

    If you simply don't want a dash at the end and beginning, try ^[^-].*?[^-]$

    Edit: Bah, you keep changing it.

    0 讨论(0)
  • 2021-02-14 13:18

    It should be something like this:

    ^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$
    

    You are telling it to look for only one char, either a-z, A-Z, 0-9 or -, that is what [] does.

    So if you do [abc] you will match only "a", or "b" or "c". not "abc"

    Have fun.

    0 讨论(0)
提交回复
热议问题