允许特殊字符,但仅当特殊字符时不允许

时间:2020-03-07 05:31:11

标签: regex

假设我有这个:

[a-zA-Z0-9., -&:]+

允许一次或多次使用字母数字字母和一些特殊字符(逗号,点,破折号等)。但是现在,我只允许在还有字母数字字母时允许使用这些特殊字符:

a-b, c:好

.a::好

,-.:不好

,:不好

我尝试了一些方法,但仍然找不到解决方法。我该怎么办?

2 个答案:

答案 0 :(得分:2)

如果要确保其中至少有一个字母数字字符,可以使用:

git remote add origin1 git@github.com:ppreyer/first_app.git 

这基本上是您当前模式的零个或多个(稍作修改的(a)),后跟一个字母数字,然后又是您当前模式的零个或多个。除非字符串包含一个或多个字母数字,否则不能保证匹配。


如果使用允许部分匹配的regex函数,则您可能还需要考虑将[a-zA-Z0-9., &:-]*[a-zA-Z0-9][a-zA-Z0-9., &:-]* ^标记放在模式的末尾。没有这个,您就可以匹配$之类的东西。如果您使用的是“完全匹配”功能,则不必


(a)根据另一个答案中的注释,修改是将<some-invalid-character>A移动到正则表达式的末尾,以将其视为文字连字符而不是字符范围。

答案 1 :(得分:1)

我会在这里使用一个替代项:

^(?=.*[A-Za-z0-9])[a-zA-Z0-9., &:-]+$

此正则表达式读起来很接近您的要求,并说要匹配:

^                      from the start of the string
    (?=.*[A-Za-z0-9])  assert that at least one alphanumeric character be present
    [a-zA-Z0-9., &:-]+  if so, then match either alphas or certain symbols
$                      end of the string

Demo

旁注:请注意,在原始角色类中,您在中间的某处放置了破折号:

[a-zA-Z0-9., -&:]+

这实际上在空格字符和&之间定义了字符的范围;连字符是 not 。您可以在我的正则表达式中看到我将破折号移到了班级的末尾,以确保将其作为文字包含在内。