匹配浮点数的任务

时间:2019-09-01 10:28:33

标签: regex pcre

任务:

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

这几乎适用于所有内容,除了最后两个数字(4和4)并卡住了

2 个答案:

答案 0 :(得分:1)

您可以使用

(?<!\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}}或.和1个以上的数字
    • ,-或
    • |-仅在数字前加点或逗号(以避免匹配独立的(?<=\d)[,.].
  • ,-字符串的结尾或空格必须立即显示在右侧。

正则表达式图:

enter image description here

enter image description here

答案 1 :(得分:1)

您可以使用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