【问题标题】:RegEx pattern to not allow special character except underscore正则表达式模式不允许除下划线以外的特殊字符
【发布时间】:2019-04-17 11:05:10
【问题描述】:

我有一个特殊要求,我需要实现以下目标

  1. 除字符串之间的_ 外,不允许使用特殊字符。
  2. 字符串不应以_. 和数值开头或结尾。
  3. 不得在任何数值前后使用下划线。

我能够实现大部分,但我的 RegEx 模式也允许其他特殊字符。

我如何修改下面的 RegEx 模式以不允许任何特殊字符(除了下划线)在字符串之间。

^[^0-9._]*[a-zA-Z0-9_]*[^0-9._]$

【问题讨论】:

  • 另外,下面的模式对我有用,但我确信这不是最好的解决方案。 ^[^0-9`|\~|\!|\@|\#|\$|\%|\^|\&|\*|\(|\)|\+|\=|\[|\{|\]|\}|\||\\|\'|\<|\,|\.|\>|\?|\/|\""|\;|\:|\s]*[a-zA-Z0-9_]*[^`|\~|\!|\@|\#|\$|\%|\^|\&|\*|\(|\)|\+|\=|\[|\{|\]|\}|\||\\|\'|\<|\,|\.|\>|\?|\/|\""|\;|\:|\s]*[^0-9`|\~|\!|\@|\#|\$|\%|\^|\&|\*|\(|\)|\+|\=|\[|\{|\]|\}|\||\\|\'|\<|\,|\.|\>|\?|\/|\""|\;|\:|\s]$
  • 试试/^(?=[A-Z])(?=.*[A-Z]$)(?!.*_\d)(?!.*\d_)\w+$/i

标签: javascript regex


【解决方案1】:

您可能会做的是使用negative lookaheads 来声明您的要求:

^(?![0-9._])(?!.*[0-9._]$)(?!.*\d_)(?!.*_\d)[a-zA-Z0-9_]+$

说明

  • ^断言字符串的开头
  • (?![0-9._]) 否定前瞻断言字符串不以 [0-9._] 开头
  • (?!.*[0-9._]$) 否定前瞻断言字符串不以 [0-9._] 结尾
  • (?!.*\d_) 否定前瞻断言字符串不包含后跟下划线的数字
  • (?!.*_\d) 否定前瞻断言字符串不包含下划线后跟数字
  • [a-zA-Z0-9_]+ 匹配字符类中指定的内容一次或多次。您可以将允许匹配的内容添加到字符类中,例如还可以添加 .
  • $断言字符串结束

Regex demo

【讨论】:

    【解决方案2】:

    您的开头和结尾部分; [^0-9._],说匹配除这些以外的任何字符。

    所以你需要把它改成你能匹配的。

    /^[A-Z][A-Z0-9_]*[A-Z]$/i
    

    既然你现在说一个字符是有效的:

    /^[A-Z]([A-Z0-9_]*[A-Z])?$/i
    

    【讨论】:

    • 这很好用,但有一个小问题,它至少需要 2 个字符才能验证。我想知道有一个可以使用单个字符的解决方案。
    • 嗯,我确实添加了它,这是简单的模式,怀疑你需要复杂的前瞻性。
    【解决方案3】:

    保持简单。只允许下划线和字母数字正则表达式:

    /^[a-zA-Z0-9_]+$/
    

    Javascript es6 实现(适用于 React):

    const re = /^[a-zA-Z0-9_]+$/;
    re.test(variable_to_test);
    

    【讨论】:

      猜你喜欢
      • 2019-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      • 1970-01-01
      • 2017-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多