【问题标题】:Regex can't seem to quite capture decimal point正则表达式似乎无法完全捕获小数点
【发布时间】:2023-03-10 04:15:01
【问题描述】:

我想捕捉字符“FM”后面的实数 我拥有的正则表达式在大多数情况下都会这样做,除非在字符 FM 之后直接有一个小数点,例如 FM.3 它只捕获数字 3 而不是小数点。

这是我的正则表达式

FM\W?(\.{0,1}\d?\.?\d?)?

这里是要测试的字符串

MC1 FM1.2 MC2,
 FM.3,
FM 3,
FM.3,
FM 2 MC1,
FM 0.2 P1 MC1,
FM .3 ,

这是一个演示 https://regex101.com/r/ZBVpuS/2 在此链接上更容易看到问题

【问题讨论】:

  • 哪种语言?
  • 你使用\W而不是\s有什么原因吗?您可以将其更改为 [^\w.]? 以实现您想要的。
  • 塞巴斯蒂安,谢谢,不,没有理由,现在我想起来,它永远只是一个空格。 \s 效果很好。

标签: regex


【解决方案1】:

See regex in use here

FM\s*(\.\d+|\d+(?:\.\d+)?)
  • FM 按字面意思匹配
  • \s* 匹配任意数量的空白字符
  • (\.\d+|\d+(?:\.\d+)?) 将以下任一选项捕获到捕获组 1
    • \.\d+ 匹配 . 后跟一位或多位数字
    • \d+(?:\.\d+)? 匹配一位或多位数字,可选地后跟一个点和一位或多位数字。如果要允许匹配小数点后没有数字的数字,例如 1.,可以将 \.\d+ 更改为 \.\d*

【讨论】:

    【解决方案2】:

    您不需要\W,它会吞下点(非单词字符):

    FM\s*(\.?\d?\.?\d?)?
    

    捕获组之外的\s* 将删除 FM 之后的所有空格。

    【讨论】:

    • 这很好用。我将已解决的问题交给了 ctwheels,因为它是一个更全面的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 2018-08-20
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    相关资源
    最近更新 更多