【问题标题】:How to invert an existing regular expression in javascript?如何在javascript中反转现有的正则表达式?
【发布时间】:2014-03-16 22:58:13
【问题描述】:

我创建了一个正则表达式来验证时间,如下所示:([01]?\d|2[0-3]):[0-5]\d

匹配正确:08:0009:009:0013:0023:59

匹配错误:10.0024:0025:3023:62afdasdasdten


问题

如何反转 javascript 正则表达式以验证是否不是时间?

注意 - 我已经看到了几种在堆栈上执行此操作的方法,但似乎无法让它们适用于我的表达式,因为我不明白反转表达式应该如何工作。

http://regexr.com?38ai1


回答

最简单的解决方案是反转 javascript 语句而不是正则表达式本身。

if (!(/^(([01]?\d|2[0-3]):[0-5]\d)/.test(obj.value))

只需添加!创建一个 if NOT 语句。

【问题讨论】:

  • 不要反转正则表达式,反转检查它的if
  • 否定验证结果似乎比为任何不是时间的东西创建正则表达式更简单。
  • 我曾考虑过这一点,但很好奇人们的想法在哪里。

标签: javascript regex time


【解决方案1】:

正如我在评论中提到的,更好的方法是否定测试,而不是创建一个匹配任何非时间的新正则表达式。

但是,如果你真的需要正则表达式,你可以使用负前瞻来匹配不是时间的开始:

/^(?!([01]?\d|2[0-3]):[0-5]\d$)/

演示:http://regex101.com/r/bD3aG4

请注意,我锚定了正则表达式(^ 和 $),它可能无法满足您的需要。

【讨论】:

  • 在您链接的网站中,它似乎与不符合时间的陈述不符,就像 OP 询问的那样......
  • @EladStern:怎么样?似乎对我有用——也许它被编辑了?
  • 看起来匹配只是不是时间的行之前的空格,而不是实际的语句。
  • @EladStern 是的,它与整个语句不匹配,只是语句的开头(甚至不是空格)。如果需要匹配语句,只需在前瞻部分后添加.*,如here
【解决方案2】:

正则表达式通常用于捕获某些特定条件 - 越具体,正则表达式越好。您正在寻找的是一个非常广泛的匹配条件,因为几乎所有内容都不会被视为“时间”(空格、特殊字符、字母字符等)。

正如 cmets 中所建议的,对于您想要实现的目标,寻找时间然后检查(并否定)该正则表达式的结果会更有意义。

【讨论】:

  • 感谢您的建议。
猜你喜欢
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多