[英]JavaScript Regex: Match "-" only if a digit is followed by "-", but not match when there is only single "-"
[英]Regex to match digits only if not followed or proceeded by letters in Javascript
我想匹配数字,但不匹配单词(在 JavaScript 中)。
以下应匹配:
1
1,2
1.5-4 (matches 1.5 & 4 separately)
(1+3) (matches 1 & 3 separately)
=1;
以下不应该匹配:
FF3D
3deg
我以为我可以用负向预测来解决,就像这样: (?![A-Za-z]+)([0-9]+[\\.|\\,]?[0-9]?)
但它不起作用。
我怎样才能最好地解决这个问题? 谢谢。
2021年更新:
由于后视支持已显着增长,因此使用基于后视的解决方案是有意义的:
/(?<![a-z])\d*[.,]?\d+(?![a-z])/gi # ASCII only
/(?<!\p{L})\p{N}*[.,]?\p{N}+(?!\p{L})/giu # Unicode-aware
请参阅正则表达式演示。 请在此处跟踪后视和 Unicode 属性类支持。
细节
(?<![az])
- 当前位置的左侧不允许有 ASCII 字母(或任何 Unicode 字母,如果使用\\p{L}
)\\d*[.,]?\\d+
(?![az])
- 当前位置的右侧不允许有 ASCII 字母(或任何 Unicode 字母,如果使用\\p{L}
)。原答案
为了匹配任何独立的整数或浮点数,您需要使用点或逗号作为小数点分隔符
/(?:\b\d+[,.]|\B[.,])?\d+\b/g
请参阅正则表达式演示。 这里的要点是您不能在\\b
之前使用单词边界\\b
.
因为它会使所有匹配项无效,例如.55
(仅匹配55
)。
详情:
(?:\\b\\d+[,.]|\\B[.,])?
- 两种选择之一:
\\b\\d+[,.]
- 一个单词边界(在字符串之前或开始之前必须有一个非单词字符),然后是 1+ 位数字,然后是一个.
或,
|
- 或者\\B[.,]
- 单词边界以外的位置(仅非单词字符或字符串开头),然后是.
或,
\\d+
- 1+ 位数\\b
- 单词边界。 const regex = /(?:\\b\\d+[,.]|\\B[.,])?\\d+\\b/g; const str = `.455 and ,445 44,5345 435.54 4444 1 1,2 1.5-4 (1+3) =1; FF3D 3deg`; console.log(str.match(regex));
如果您还需要添加对指数的支持,请使用:
/(?:\b\d+[,.]|\B[.,])?\d+(?:e[-+]?\d+)?\b/ig
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.