【问题标题】:Regular expression that accepts alphanumeric , non consecutive dash and non consecutive white space接受字母数字、非连续破折号和非连续空格的正则表达式
【发布时间】:2011-09-30 18:54:34
【问题描述】:

谁能帮我创建一个接受字母数字(仅限数字和字母)以及破折号和空格的正则表达式。

它不应该接受连续的破折号和连续的空格。或一个破折号后跟一个空格,反之亦然。 它也应始终以字母数字字符开头和结尾。

非常感谢。任何帮助将不胜感激。 (^-^)v

'Abcde' , '324 3a-32' : valid

'-' , '324 3a - 32' , '-2323  d-', 'z- -a' : invalid

感谢大家的帮助。 v(",)\

【问题讨论】:

  • ASCII 或 Unicode 字母?您使用什么编程语言?
  • Javascript。我使用了 Alan Moore 发布的正则表达式。谢谢。

标签: regex


【解决方案1】:

试试这个:

^[A-Za-z0-9]+(?:[\s-][A-Za-z0-9]+)*$

当第一个 [A-Za-z0-9]+ 用完字母和数字时,组内的 [\s-] 会尝试匹配连字符或空白字符。如果成功,第二个[A-Za-z0-9]+ 会尝试匹配更多的字母数字。并且该组会根据需要重复多次。

【讨论】:

  • 非常感谢。这一款最符合要求。太感谢了。这非常有帮助。 o(^-^)v
  • 我的荣幸。如果此答案解决了您的问题,请将其标记为已接受(答案旁边的绿色复选标记图标)。
  • 如何排除空格?
  • 因为我确实有空格和破折号,而且我喜欢破折号周围的空格(可选)我的正则表达式是:^[A-Za-z0-9]+((\s|\s?-\ s?)[A-Za-z0-9]+)*$ - 这允许单个空格、破折号(前后可能有空格)。同样允许空格,逗号后面。按空间是微不足道的。
【解决方案2】:

试试这个正则表达式:

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

【讨论】:

  • 这似乎匹配,即使最后有一个 - (使用 Perl 测试)
  • @Cfreak,不,这是不正确的。匹配的字符串总是以类中的字符开头和结尾:[a-zA-Z0-9]
  • 这个正则表达式看起来不错,但是[ \t-] 之后的? 没有业务存在。该部分每次应用时都必须与一个字符完全匹配;这不是可选的。
【解决方案3】:

ASCII 答案

^(?!.*[- ]{2})(?!^[- ])(?!.*[- ]$)[A-Za-z0-9- ]+$

here on Regexr

^匹配字符串的开头

$匹配字符串的结尾

[A-Za-z0-9- ]+匹配你想要的字符,至少一个

负前瞻

(?!.*[- ]{2}) 确保在一行中没有 - 或空格

(?!^[- ])(?!.*[- ]$) 这两个确保它不会以这些字符开头和结尾。

对于 unicode 答案,您应该指定您使用的语言

对于某些人,您可以使用 \p{L} See here 来描述具有“字母”属性的 unicode 代码点。

【讨论】:

  • 虽然是正确的,但首选没有所有环视(易于构建)的模式,IMO。
  • 你忘记了p{L}之前的反斜杠。
【解决方案4】:
/[\da-z]+[ -]?([\da-z][ -]?)*[\da-z]/i

【讨论】:

  • 这将拒绝一个字母,这应该是 OP 的定义有效的。
  • “它应该始终以字母数字字符开头和结尾”。我看到的是复数,这会有所不同。考虑到这与“它应该始终以字母数字字符开头和结尾”这句话相矛盾,后者也适合单个字符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-15
  • 2016-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多