【问题标题】:Regex to filter out "n" occurence of character正则表达式过滤掉“n”个字符的出现
【发布时间】:2015-01-21 17:31:16
【问题描述】:

我需要一个正则表达式(用于输入验证)来过滤除“下划线”以外的所有特殊字符,因此允许 [a-zA-Z0-9\underscore] 范围内的所有字符并且可以出现多次.但在我的表达中,我不能连续出现 2 次“下划线”,而且我的字符串也不能以“_”开头。

【问题讨论】:

  • 过滤掉?你的意思是替换那些不符合条件的人
  • 您能否提供一个有效和无效输入的列表?
  • 不,我不必更换。我将只接受 [a-zA-Z0-9\underscore] 范围内的所有字符作为输入字段的输入,但我不能接受以下划线开头或连续两次出现下划线的输入字符串。但是以一个下划线结尾的字符串是可以的。
  • 为什么不简单地过滤两次呢? value.replace(/\W/g, "").replace(/^_|_(?=_)/g,"")
  • 我很困惑。在问题中你说“我的字符串也不能以"_" 开头,但是你接着说"_hello09_Hello" 是有效的。为什么这是有效的?

标签: javascript regex angularjs validation


【解决方案1】:

我认为您想使用groups 以便repetitions 正常工作:

/[A-Za-z0-9]+(?:_(?:[A-Za-z0-9]+|$))*/

【讨论】:

    【解决方案2】:
    /^([a-zA-Z0-9]_?)+$/
    

    一个或多个...字母数字字符(可选地后跟一个下划线)

    【讨论】:

    • 可以稍微简化为/^(?:[a-z\d]_?)+$/i
    • @Phrogz 我不确定这是否更简单,它可能会更好,但我认为理解起来更复杂。您如何看待这种替代方案...^(?:[^_\W]_?)+$
    • 我同意您的原件更容易理解。我认为您提出的变体非常有趣和聪明,但不推荐。 :)
    • 这个解决方案的特点是灾难性的回溯与删除的答案一样多:-(
    • @Bergi 这是真的。你的答案就像我的答案的正确版本,虽然,我认为你需要锚定它,正如@phrogz 指出的那样....../^[A-Za-z0-9]+(?:_(?:[A-Za-z0-9]*))*$/
    【解决方案3】:

    有时你会发现颠倒你的逻辑——发现任何问题,而不是确保没有问题——会产生一个更简单的解决方案:

    // starts with underscore
    // or has two underscores in a row
    // or has a character other than alpha/numeric/underscore
    var bad = /^_|_{2}|\W/;
    if (bad.test(input)) myInputIsIllegal();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-16
      • 1970-01-01
      • 2020-09-13
      • 2010-12-18
      • 2012-04-06
      • 2011-05-08
      • 2012-10-13
      相关资源
      最近更新 更多