繁体   English   中英

正则表达式仅在 Javascript 中没有跟在或后面没有字母的情况下才匹配数字

[英]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]?)但它不起作用。

我怎样才能最好地解决这个问题? 谢谢。

我想匹配数字,但不匹配单词。

您可以在正则表达式中使用环视:

\b\d*[,.]?\d+\b
  • \\b用于单词边界

正则表达式演示

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

尝试这个

var pattern= /([\d.]+)/;

https://regex101.com/r/q1qDHV/1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM