正则表达式Javascript,带空格的负向前瞻

时间:2017-07-02 09:41:55

标签: javascript angularjs regex

在我的Javascript角度应用程序中,我有 regex 来验证用户名。

我在进行大量研究后面临的问题是,使用包含空格的表达式否定前瞻是行不通的。

要求

用户名可以由许多字母数字字符串组成,最多可以分隔一个空格。边缘处的空格是不允许的。用户名也应该针对几个被禁止的名称进行过滤。

1)

(/^[a-zA-Z\d]+([\s][a-zA-Z\d]+)+?$/).test("admin may not be used") 

允许字母数字单词一次被一个后续空格拆分,并且不允许边缘处的空格

2)

(/^(?!(?:admin|alfred)$)[a-zA-Z\d]+$/).test("admin")

有效且不允许使用管理员

3)合并两者:

(/^(?!(?:admin|alfred)$)[a-zA-Z\d]+([\s][a-zA-Z\d]+)+?$/).test("admin may not be used") 

失败!并允许使用禁止的单词admin。

预期结果:

预期两个过滤器都可以工作,即禁止的单词列表,以及随之而来的空间过滤器。 你能指出我的表达可能有什么问题吗?

1 个答案:

答案 0 :(得分:2)

您可以考虑使用

/^(?!.*\b(?:admin|alfred)\b)[a-zA-Z\d]+(?:\s[a-zA-Z\d]+)+$/

或更长一点,但更有效(但可读性更低):

/^(?!(?:admin|alfred)\b)[a-zA-Z\d]+(?:\s(?!(?:admin|alfred)\b)[a-zA-Z\d]+)+$/

请参阅regex demo

如果允许使用一个单词用户名,则用+(1或0次重复)量词(demo)替换最后?(1次或多次重复)。

如果您在AngularJS中使用它,也可以使用ng-trim="false"来确保不允许前导和尾随空格。

模式详情

  • ^ - 字符串开头
  • (?!.*\b(?:admin|alfred)\b) - 在零个或多个字符(.*)之后,整个单词不能adminalfred(否则,正则表达式将返回false)< / LI>
  • [a-zA-Z\d]+ - 一个或多个字母数字
  • (?: - 开始non-capturing group
    • \s - 空白
    • [a-zA-Z\d]+ - 一个或多个字母数字
  • )+ - 将重复一次或多次的非捕获组的结束
  • $ - 字符串结束。