匹配浮点数的任务

Task for matching floating point numbers

任务:

MATCH:
3.45
5,4
.45
3e4
,54
4
4.
4,

DON'T MATCH:
4,5e
2e
.3.
2e,4
,4.
d34
2.45t
2,45.

目前我想出了以下几点:

(?<=\s|^)[-+]?(?:(?:[.,]?\d+[.,]?\d*[eE]\d+(?!\w|[.,]))|[.,]?\d+[.,]?\d*(?!\w|[.,]))\b

这几乎适用于所有情况,除了最后 2 个数字(4. 和 4,)并卡住了

您可以使用

(?<!\S)[-+]?[0-9]*(?:[.,]?[0-9]+(?:[eE][-+]?[0-9]+)?|(?<=\d)[,.])(?!\S)

regex demo

详情

  • (?<!\S) - 字符串的开头或空格必须立即出现在左侧
  • [-+]? - 可选的 +-
  • [0-9]* - 0+ 位
  • (?:[.,]?[0-9]+(?:[eE][-+]?[0-9]+)?|[,.]) - 要么
    • [.,]?[0-9]+(?:[eE][-+]?[0-9]+)? - 一个可选的 .,,然后是 1+ 个数字,然后是一个可选的 eE 序列,后跟一个可选 ., 和 1+ 位
    • | - 或
    • (?<=\d)[,.] - 仅当前面有数字时才为点或逗号(以避免匹配独立的 .,
  • (?!\S) - 字符串结尾或空格必须紧靠右侧出现。

正则表达式图:

您可以使用 alternation 匹配 1+ 位后跟点或逗号和 0+ 位,或者匹配 Ee 部分后跟 1+ 位。

或匹配以点或逗号开头,后跟 1+ 个数字。

如果这是该行唯一匹配的内容,您可以使用锚点 ^$ 或使用环视来断言左右两侧没有非空白字符。

(?<!\S)(?:\d+(?:[.,]\d*|[eE]\d+)?|[.,]\d+)(?!\S)

图案部分

  • (?<!\S) 断言左边的不是非空白字符
  • (?:非捕获组
    • \d+ 匹配 1+ 个数字
    • (?:非捕获组
      • [.,]\d* 匹配 ., 和 0+ 个数字
      • |
      • [eE]\d+ 匹配 eE 和 1+ 个数字
    • )? 关闭组并使其可选
    • |
    • [.,]\d+ 匹配 ., 和 1+ 个数字
  • ) 关闭群组
  • (?!\S) 断言右边的不是非空白字符

Regex demo