我使用这个正则表达式:
/^(?!0000)(?!0+(?:[.,]\d{1,2})?$)\d{1,4}(?:[.,]\d{1,2})?$/
它允许十进制数字(。和,分隔符),在分隔符后面有两位数。它不允许零值。我想要做的是让它允许数字,如0.1和0.09等...这里不可能写任何从0开始的数字。我不知道如何做到这一点。有什么想法吗?
感谢。
答案 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
(?![,.0]*$)
将阻止输入中只有0,点或逗号的输入。
答案 2 :(得分:0)
任何基于正则表达式的方法都可以轻而易举地绕过。例如,他们可以使用以下任何一种方法来规避您的正则表达式过滤器:
+0
- 从+
-0
- 从-
0e0
- 科学记谱法1e-999
- 不是真实的0,但最有可能是转换后的一个。以上任何方法的组合。 长话短说:正则表达式不会在这里工作。 尝试将字符串转换为数字,如果等于0则拒绝。 您应该能够在大多数语言中执行此操作,包括JavaScript。