正则表达式不允许零

时间:2017-09-19 07:32:22

标签: regex

我使用这个正则表达式:

/^(?!0000)(?!0+(?:[.,]\d{1,2})?$)\d{1,4}(?:[.,]\d{1,2})?$/

它允许十进制数字(。和,分隔符),在分隔符后面有两位数。它不允许零值。我想要做的是让它允许数字,如0.1和0.09等...这里不可能写任何从0开始的数字。我不知道如何做到这一点。有什么想法吗?

感谢。

3 个答案:

答案 0 :(得分:0)

由于您提到了JS / Angular,您可以将所有,替换为.(如果小数分隔符为,)并将字符串转换为数字以检查它是否为零,如果是,则使用简化的正则表达式/^\d{1,4}(?:[.,]\d{1,2})?$/,确保整个部分有1到4位数,小数部分有1到2位数字:

function check(str) {
  str = str.replace(/,/g, ".");
  if ( parseFloat(str) > 0 ) {
     return /^\d{1,4}(?:\.\d{1,2})?$/.test(str);
  }
  return false;
}

console.log(check("0,00"));
console.log(check("0,09"));
console.log(check("900000"));

如果您无法访问代码,请调整负面预测,例如

^(?!0+(?:[.,]0+)?$)\d{1,4}(?:[.,]\d{1,2})?$

请参阅regex demo

(?!0+(?:[.,]0+)?$)否定前瞻仅在字符串以1或更多零开头时才会失败,然后具有,.的可选序列,后跟1个或多个零。

  • ^ - 字符串的开头
  • (?!0+(?:[.,]0+)?$) - 如果匹配的是一个序列,则拒绝匹配
    • 0+ - 1个或多个零
    • (?:[.,]0+)? - .,的可选序列,后跟1个或多个零
  • \d{1,4} - 1到4位
  • (?:[.,]\d{1,2})? - 可选序列:
    • [.,] - .,
    • \d{1,2} - 任意1或2位数字
  • $ - 字符串结束。

超前模式可能会缩减为(?!0*[.,]?0+$),因为消费模式将确保匹配正确的格式。

答案 1 :(得分:0)

只需一个否定前瞻即可简化正则表达式:

/^(?![,.0]*$)\d{1,4}(?:[.,]\d{1,2})?$/gm

RegEx Demo

(?![,.0]*$)将阻止输入中只有0,点或逗号的输入。

答案 2 :(得分:0)

任何基于正则表达式的方法都可以轻而易举地绕过。例如,他们可以使用以下任何一种方法来规避您的正则表达式过滤器:

  • +0 - 从+
  • 开始
  • -0 - 从-
  • 开始
  • 0e0 - 科学记谱法
  • 1e-999 - 不是真实的0,但最有可能是转换后的一个。

以上任何方法的组合。 长话短说:正则表达式不会在这里工作。 尝试将字符串转换为数字,如果等于0则拒绝。 您应该能够在大多数语言中执行此操作,包括JavaScript。