【发布时间】:2020-03-07 05:31:11
【问题描述】:
假设我有这个:
[a-zA-Z0-9., -&:]+
允许使用字母数字字母和一些特殊字符(逗号、点、破折号等)一次或多次。但是现在,我只想在还有字母数字字母时允许那些特殊字符:
a-b, c:好的
.a::好的
,-.:不行
,:不行
我尝试了一些东西,但仍然无法找到一种方法。我该怎么做?
【问题讨论】:
标签: regex
假设我有这个:
[a-zA-Z0-9., -&:]+
允许使用字母数字字母和一些特殊字符(逗号、点、破折号等)一次或多次。但是现在,我只想在还有字母数字字母时允许那些特殊字符:
a-b, c:好的
.a::好的
,-.:不行
,:不行
我尝试了一些东西,但仍然无法找到一种方法。我该怎么做?
【问题讨论】:
标签: regex
如果您想确保其中至少有一个字母数字字符,您可以使用:
[a-zA-Z0-9., &:-]*[a-zA-Z0-9][a-zA-Z0-9., &:-]*
这基本上是零个或多个当前模式(稍作修改(a)),然后是一个字母数字,然后是零个或多个当前模式。这保证不匹配,除非字符串包含一个或多个字母数字。
如果您使用允许部分匹配的正则表达式函数,您可能还需要考虑将^ 和$ 标记放在模式的末尾。没有它,您可以匹配 <some-invalid-character>A 之类的内容。如果您使用的是“完全匹配”功能,则此可能不是必需的。
(a) 根据另一个答案中的 cmets,修改是将 - 移动到正则表达式的末尾,以将其视为文字连字符而不是字符范围。
【讨论】:
我会在这里使用替代:
^(?=.*[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
旁注:请注意,在您的原始字符类中,您在中间某处放置了破折号:
[a-zA-Z0-9., -&:]+
这实际上在空格字符和&之间定义了一个范围的字符;连字符是 not 被包括在内。您可以在我的正则表达式中看到我已将破折号移至类的末尾,以确保将其作为文字包含在内。
【讨论】:
^((?=.*[A-Za-z0-9])[a-zA-Z0-9., &:-]+)$ 应该足够了吗?
^(?![., &:-]*$)[a-zA-Z0-9., &:-]+$, (?![., &:-]*$) 是一个负前瞻(仅字符串中的特殊字符)。