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

oro*_*aki 9 python regex

更新:

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

解:

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

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

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

允许值:

spam123-spam-eggs-eggs1
spam123-eggs123
spam
1234
eggs123
Run Code Online (Sandbox Code Playgroud)

不允许的值:

eggs1-
-spam123
spam--spam
Run Code Online (Sandbox Code Playgroud)

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

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

# Nothing here
Run Code Online (Sandbox Code Playgroud)

Gum*_*mbo 16

试试这个正则表达式:

^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$
Run Code Online (Sandbox Code Playgroud)

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


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

a(bc)*
Run Code Online (Sandbox Code Playgroud)

是相同的

a|abc|abcbc|abcbcbc|abcbcbcbc|…
Run Code Online (Sandbox Code Playgroud)

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

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