【问题标题】:javascript - regex for alphanumeric and special characterjavascript - 字母数字和特殊字符的正则表达式
【发布时间】:2018-12-12 14:25:32
【问题描述】:

尝试为具有以下条件的字符串(公司/组织名称)构建正则表达式:

  • 没有前导或尾随空格
  • 中间没有双空格
  • 不应只允许单个字符(字母数字或白名单)
  • 可以以字母数字或白名单字符开头
  • 不应允许多次输入任何白名单字符

这些的正则表达式:/(?! )([a-zA-Z0-9_\.\-#&])+([a-zA-Z0-9_\.\-#&\s])*(?<! )$/

console.log(/(?! )([a-zA-Z0-9_\.\-#&])+([a-zA-Z0-9_\.\-#&\s])*(?<! )$/.test('_')); // shouldn't allow

console.log(/(?! )([a-zA-Z0-9_\.\-#&])+([a-zA-Z0-9_\.\-#&\s])*(?<! )$/.test('a')); // shouldn't allow

console.log(/(?! )([a-zA-Z0-9_\.\-#&])+([a-zA-Z0-9_\.\-#&\s])*(?<! )$/.test('abc   abc')); // shouldn't allow

console.log(/(?! )([a-zA-Z0-9_\.\-#&])+([a-zA-Z0-9_\.\-#&\s])*(?<! )$/.test('_123')); // works fine

console.log(/(?! )([a-zA-Z0-9_\.\-#&])+([a-zA-Z0-9_\.\-#&\s])*(?<! )$/.test('# abc')); // works fine

console.log(/(?! )([a-zA-Z0-9_\.\-#&])+([a-zA-Z0-9_\.\-#&\s])*(?<! )$/.test('abc abc!')); // works fine

console.log(/(?! )([a-zA-Z0-9_\.\-#&])+([a-zA-Z0-9_\.\-#&\s])*(?<! )$/.test('abc abc# abc')); // works fine

当前的正则表达式不符合所有条件,无法弄清楚正则表达式有什么问题?

【问题讨论】:

  • 试试/^[a-zA-Z0-9_.#&amp;-]+(?:\s[a-zA-Z0-9_.#&amp;-]+)*$/
  • @WiktorStribiżew 这个正则表达式允许单个字符。 /^[a-zA-Z0-9_.#&amp;-]+(?: [a-zA-Z0-9_.#&amp;-]+)*$/.test('#') 这应该返回 false 但它返回 true。
  • @Valay 什么是“白名单字符”?
  • 我看到你的预期匹配也有!,但你的正则表达式没有。我在答案中将! 添加到字符类中。您可以在那里添加更多字符,但请注意 - 必须留在字符类的末尾,就在 ] 之前。
  • @georg 有效点。这是不应该的。更新要求。谢谢。

标签: javascript regex


【解决方案1】:

你可以使用

/^(?=.{2})(?!(?:[^_.#&!-]*[_.#&!-]){2})[a-zA-Z0-9_.#&!-]+(?:\s[a-zA-Z0-9_.#&!-]+)*$/

详情

  • ^ - 字符串开头
  • (?=.{2}) - 任何 2 个字符都必须在开头
  • (?!(?:[^_.#&amp;!-]*[_.#&amp;!-]){2}) - 字符串中没有出现 2 次 _.#&amp;!- 字符
  • [a-zA-Z0-9_.#&amp;-]+ - 1 个或多个允许的字符(空格除外)
  • (?:\s[a-zA-Z0-9_.#&amp;!-]+)* - 0+ 次
    • \s - 1 个空格
    • [a-zA-Z0-9_.#&amp;!-]+ - 1+ 个字母、数字和一些符号
  • $ - 字符串结束。

JS 演示

var rx = /^(?=.{2})(?!(?:[^_.#&!-]*[_.#&!-]){2})[a-zA-Z0-9_.#&!-]+(?:\s[a-zA-Z0-9_.#&!-]+)*$/;
console.log(rx.test('_')); // shouldn't allow
console.log(rx.test('a')); // shouldn't allow
console.log(rx.test('abc   abc')); // shouldn't allow
console.log(rx.test('_123')); // works fine
console.log(rx.test('# abc')); // works fine
console.log(rx.test('abc abc!')); // works fine
console.log(rx.test('abc abc# abc')); // works fine

【讨论】:

  • 您的答案完美无缺,但在乔治指出之后,我在要求中又加了一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-19
  • 2014-01-07
  • 1970-01-01
  • 2012-12-06
相关资源
最近更新 更多