【问题标题】:Regex for increasing/decreasing number pattern用于增加/减少数字模式的正则表达式
【发布时间】:2017-08-21 18:51:33
【问题描述】:

如何测试字符串中的递增或递减数字模式? 假设字符串只是一个数字。

例如:

var regexp = new RegExp(...) // something here
regexp.test("123456789") //true
regexp.test("121231234") //false
regexp.test("987654321") //true
regexp.test("5678901234") //true

测试实际上是一个数字循环。 这是如何实现的?

【问题讨论】:

  • 135 是否有效匹配?
  • 为什么需要正则表达式?
  • 为什么需要为此使用正则表达式?为什么不直接解析数字并使用正则数学表达式进行比较?
  • 我正在使用 angular 来匹配验证模式
  • 什么意思?我看不出 Angular 与此有​​什么关系。

标签: javascript regex


【解决方案1】:

这个乱七八糟的正则表达式是我能产生的最好的。它查找升序或降序数字组。您需要在任一端进行开始和结束检查,但是,我不知道您想要哪种类型。例如,您可能希望将开始行 (^) 和结束行 ($) 包裹在此正则表达式周围。如果您不熟悉http://www.regular-expressions.info/lookaround.html,它会使用您可能想要查找的前瞻。

(((?=01|12|23|34|45|56|67|78|89|90)\d)+|((?=
09|98|87|76|65|4|43|32|21|10)\d)+)\d

【讨论】:

  • (((?=01|12|23|34|45|56|67|78|89|90)\d)+|((?=09|98|87|76|65|54|43|32|21|10)\d)+)\d 删除了过时的括号,但我仍在努力完全理解它。干得好。
  • 我已经根据您的改进编辑了我的答案。我想用正则表达式找到一个添加 cmets。但是,由于行长和格式问题,我很讨厌写它,所以我把它扔在那里。
【解决方案2】:

如果您确实需要使用正则表达式来执行此操作,那么这是我想到的最简单的解决方案:

/(^0*1*2*3*4*5*6*7*8*9*$)|(^9*8*7*6*5*4*3*2*1*0*$)/

* 表示“任意数量”。

【讨论】:

  • 5678901234 呢?
  • 哦,那就简单地添加|(^5678901234$)。严肃地说,我真的希望 OP 只是犯了一个错误,说这应该是有效的。
  • 匹配11112
  • 非常好,但要注意匹配这个空字符串。您可以添加 /(?=.)((^0*1*2*3*4*5*6*7*8*9*$)|(^9*8*7*6*5*4*3*2*1*0*$))/ 以确保您至少有一个字符。
【解决方案3】:

我不确定您是否可以使用正则表达式来实现,但绝对可以使用 reduce 来实现。

const test = ["123456789", "121231234", "987654321", "5678901234"];

const results = test
  .map((item) => item.split(''))
  .map((item) => {
    let lastDigit = item[0];
    return item.slice(1).reduce((flag, digit) => {
      const ret = flag && digit > lastDigit;
      lastDigit = digit;
      return ret
    }, true)
  });

console.log(results);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 2010-12-17
    相关资源
    最近更新 更多