连字符和下划线永远不能连续,但可以在字符串中多次出现

Hyphen and Underscore should never be continuous but can be present in the string more than once

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

验证:

  1. 字段应以 [a-zA-Z0-9] 开始和结束,但不能以任何特殊字符 [-_]
  2. 不能连续多次包含“-”和“_”。
    示例:
    A--Badasd(不允许)
    A__Bsdasdas(不允许)
    A-_fdsfdsd(不允许)
    A_-sfsdfsdf(不允许)
    A-B-adf(允许)
    A_b_adads(允许)

我想出了下面的正则表达式,但是,它似乎甚至不接受“-”和“_”的非连续条目。

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

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

任何帮助将不胜感激。

我只能建议基于前瞻的模式(因为 [\xFF01-\xFF5E] 匹配 _ 并且在 JS 正则表达式中限制它会使模式更麻烦):

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

参见regex demo

此模式也将匹配 1 个字符长度的字符串,并且将只匹配那些以 ASCII 字母数字字符开头和结尾且不具有 --_-、[=16= 的字符串] 和 __ 在其中。

如果你想 "block" 长度为 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}) - 如果有 2 个连续的 -_ 在除换行字符 [=53= 以外的任何 0+ 个字符之后的任何位置,则匹配失败的前瞻性检查]
    • [\xFF01-\xFF5E-]* - \xFF01-\xFF5E 范围内的任何字符 or/and -
    • [a-z0-9] - 字母数字 ASCII 字符
  • $ - 字符串结尾。