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