我正在使用这个正则表达式匹配一些字符串:
^([^\s](-)?(\d+)?(\.)?(\d+)?)$/
我很困惑为什么允许输入两个点,例如..
据我所知,只允许放1个破折号或{1}}
没有限制或没有(-)?
的任何数字
一个点或没有(\d+)?
为什么允许放置(\.)?
甚至..
?
答案 0 :(得分:5)
[^\s]
表示任何不是空白的内容。这包括点。尝试匹配..
会让你:
[^\s]
匹配.
(-)?
不匹配(\d+)?
不匹配(\.)?
匹配.
(\d+)?
不匹配<小时/> 我假设你想匹配数字(可能是负数/浮点数):
^-?\d+(\.\d+)?$
答案 1 :(得分:3)
^([^\s](-)?(\d+)?(\.)?(\d+)?)$/
^
([^\s](-)?(\d+)?(\.)?(\d+)?)
[^\s]
(-)?
(\d+)?
(\.)?
(\d+)?
$
/
答案 2 :(得分:1)
正如我在评论中提到的, [^\n]
是一个与.
匹配的否定字符类。并且由于还有另一个(\.)?
模式,正则表达式可以匹配2个连续的点(因为[^\s]
以外的所有部分都是可选的。)
为了不匹配.4.5
或..
等字符串,您只需将.
添加到[^\n]
否定字符类:
^([^\s.](-)?(\d+)?(\.)?(\d+)?)$
^
见demo。这不会让初始捕获组中的任何.
。
您可以使用前瞻只将第一个字符禁止为点:
^(?!\.)([^\s](-)?(\d+)?(\.)?(\d+)?)$
请参阅another demo
所有解释均可在在线正则表达式测试人员处获得:
为了匹配您期望的格式的数字,请使用:
^(?:[-]?\d+\.?\d*|-)$
人类可读的解释:
^
- 字符串的开头,然后有2个替代方案...... [-]?
- 可选连字符\d+
- 一位或多位\.?
- 可选点\d*
- 0位或以上|
- 或 - -
- 连字符$
- 字符串结尾请参阅demo