连字符和下划线不应该是连续的,但可以多次出现在字符串中

时间:2017-09-15 06:59:06

标签: javascript regex special-characters regex-negation

我有一个要求,我必须在Excel中验证字段。

验证

  1. 字段应以[a-zA-Z0-9]开头和结尾,但不能使用任何特殊字符[-_]
  2. 不能连续多次包含“ - ”和“_”。
    示例:
    A--Badasd(不允许)
    A__Bsdasdas(不允许)
    A-_fdsfdsd(不允许)
    A_-sfsdfsdf(不允许)
    A-B-adf(允许)
    A_b_adads(允许)
  3. 我想出了以下正则表达式,然而,它似乎甚至不接受“ - ”和“_”的非连续条目。

    ^[a-zA-z0-9]+(([\xFF01-\xFF5E]+|[\\-\\_])+)[a-zA-Z0-9]+$
    

    [\xFF01-\xFF5E]是不允许任何双倍宽度字符,所以请忽略它,因为它工作正常。

    任何帮助都会非常明显。

1 个答案:

答案 0 :(得分:0)

我只能建议一个基于前瞻的模式(因为[\xFF01-\xFF5E]匹配_并且在JS regex中限制它将使模式更加繁琐):

/^[a-z0-9](?:(?!.*?[-_]{2})[\xFF01-\xFF5E-]*[a-z0-9])?$/i

请参阅regex demo

此模式也将匹配1个字符长度的字符串,并且只匹配以ASCII字母数字字符开头和结尾的字符串,而不是--_--_和其中__

如果你想"阻止"长度为1的字符串,即将最小匹配长度设置为2,您应该从上面的模式中移除(?:)?

/^[a-z0-9](?!.*?[-_]{2})[\xFF01-\xFF5E-]*[a-z0-9]$/i

<强>详情

  • ^ - 字符串开头
  • [a-z0-9] - 字母数字ASCII字符
  • (?:(?!.*?[-_]{2})[\xFF01-\xFF5E_-]*[a-z0-9])? - 可选的(1或0次出现)序列:
    • (?!.*?[-_]{2}) - 如果在除了换行符之外的任何0 +字符之后的任何地方有2个连续的-_,则前瞻检查会使匹配失败
    • [\xFF01-\xFF5E-]* - \xFF01-\xFF5E范围内的任何字符或/和-
    • [a-z0-9] - 字母数字ASCII字符
  • $ - 字符串结束。