I created this regular expression:
^$|^[1-9]+([\.,]\d{0,2})?$
It should accept:
1
11,00
100,88 (error)
100 (error)
11.00
100.88
Shouldn't accept:
0
-5
0,55
0.55
How can I fix it?
答案 0 :(得分:2)
您可以使用可选组将整个模式括起来,并使用\d
代替[1-9]
并添加(?!0+)
否定前瞻限制,以使用前导零排除匹配值:
^(?!0+)(?:\d+(?:[.,]\d{0,2})?)?$
^^^^^^^^^ ^^
请参阅regex demo
如果您不想与53.
类似的值匹配,则需要将{0,2}
替换为{1,2}
。
模式详情:
^
- 字符串开头(?!0+)
- 开头没有零(?:\d+(?:[.,]\d{0,2})?)?
- 可选(一个或零个)序列:
\d+
- 一位或多位(?:[.,]\d{0,2})?
- 可选(一个或零个)序列:
[.,]
- .
或,
\d{0,2}
- 两位,一位或零位$
- 字符串结束。答案 1 :(得分:1)
只要第一个字符是1
和9
之间的数字,后续字符就可以是任何数字。但是,您的表达式排除了后续0
个;你需要允许任意数量的数字,只要第一个字符在1
和9
之间:
^$|^[1-9]\d*([\.,]\d{0,2})?$
^
字符串的开头[1-9]
除"0"
\d*
0到无限次之间的任何数字([\.,]\d{0,2})?
"."
或","
后跟0到2位$
字符串结尾有关进一步说明和单元测试,请参阅this示例。
答案 2 :(得分:0)
从我对你的问题的阅读中,你希望字符串“(error)”成为有效的后缀。是对的吗?如果是这样的话:
^$|^[1-9]+[0-9]*([\.,]\d{0,2})?( \(error\))?$