繁体   English   中英

[a-zA-Z0-9 \ - ]的正则表达式允许使用破折号,但不允许在开头或结尾处

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

更新:

这个问题是史诗般的失败,但这是一个有效的解决方案。 这是基于Gumbo的答案(Gumbo接近工作,所以我选择它作为接受的答案):

解:

r'(?=[a-zA-Z0-9\-]{4,25}$)^[a-zA-Z0-9]+(\-[a-zA-Z0-9]+)*$'

原始问题(虽然经过3次编辑)

我正在使用Python,我不是试图提取值 ,而是测试以确保它符合模式。

允许值:

spam123-spam-eggs-eggs1
spam123-eggs123
spam
1234
eggs123

不允许的值:

eggs1-
-spam123
spam--spam

我只是不能在开始或结束时冲刺。 这里有一个问题是通过在事实之后获取字符串值而在相反方向工作,但我只需要测试该值以便我可以禁止它。 此外,它最多可以有25个字符长 ,但至少有4个字符长 此外, 没有2个破折号可以互相接触

这是我在进行一些后观实验后得出的结果:

# Nothing here

试试这个正则表达式:

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

此正则表达式仅允许连字符分隔[a-zA-Z0-9]的一个或多个字符的序列。


编辑跟进您的评论:表达式(…)*允许组内的部分重复零次或多次。 这意味着

a(bc)*

是相同的

a|abc|abcbc|abcbcbc|abcbcbcbc|…

编辑现在您已经更改了要求:由于您可能不希望限制其长度中每个连字符分隔部分的单词,因此您需要一个前瞻性断言来考虑长度:

(?=[a-zA-Z0-9-]{4,25}$)^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$

目前的正则表达式简单易读。 您是否考虑过使用普通的Python字符串处理工具来应用其他约束,而不是让它变得冗长和复杂?

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

它应该是这样的:

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

你告诉它只查找一个字符,az,AZ,0-9或 - ,这就是[]的作用。

因此,如果您执行[abc]您将只匹配“a”,或“b”或“c”。 不是“abc”

玩得开心。

如果您只是想在结尾处开始使用破折号,请尝试^[^-].*?[^-]$

编辑:呸,你不断改变它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM