【问题标题】:REGEX get currency instead of date正则表达式获取货币而不是日期
【发布时间】:2022-01-25 22:26:06
【问题描述】:

我需要从格式的字符串中读取数字

{any number of digits} {period} {two digits}

例子:

256.23 = 256.23
231.1 = false
2321 = false
das2312.23 = false

但是,问题是这个字符串中有时会有日期,我想达到以下效果:

20.10.20 = false
23.12 = 23.12

我目前有这样的正则表达式:

(\d+\.\d{2})

但是这个返回是这样的:

29.74.23 = 29.74

我也试过了:

(\d+\.\d{2}(?!\.))

但它的回报 = 74.23。

@编辑:PHP

【问题讨论】:

  • 也许\b(?<!\d\.)(\d+\.\d{2})\b(?!\.\d) 可以(demo)?

标签: php regex


【解决方案1】:

如果您使用它的语言支持它,您将使用后向和前瞻,因此以(?<=(?:\s|^)) 开头并以(?=(?:\s|$)) 结尾,即在匹配之前应该有字符串的开头或空格,最后类似:

(?<=(?:\s|^))(\d+\.\d{2})(?=(?:\s|$))

当然,如果数字始终是字符串中唯一的内容,您可以使用:

^(\d+\.\d{2})$

(?&lt;=(?:\s|^)) 解释:

  • (?&lt;=..) 是一个lookbehind 表达式,意思是“检查它是否紧接在前面”
  • (?:\s|^) 仅表示“匹配空格或行首”,感谢?:,它不会成为编号组。

(?=(?:\s|$)) 类似,只是$ 是行尾,它以?= 开头,意思是“检查它是否紧随其后”

@thefourthbird 正确地指出,在这种情况下您可以避免非捕获组(因为它已经在后向/前瞻括号中):

(?<=\s|^)(\d+\.\d{2})(?=\s|$)

【讨论】:

  • regex101.com/r/bgbw6C/1 和我在 PHP 中的脚本出现致命错误。 pastebin.com/HsErkCFLPHP 不支持还是我做错了什么?
  • @SpectrumCodeFrom 可以省略嵌套的非捕获组(?&lt;=\s|^)\d+\.\d{2}(?=\s|$)3v4l.org/ctXuP
  • @SpectrumCodeFrom 在没有非捕获组的情况下试一试(请参阅编辑),如果仍然不起作用,则可能您的语言不支持前瞻和后瞻。在这种情况下,您应该提供有关您需要此内容的上下文的更多详细信息,因为还有其他可能性,具体取决于上下文。
  • 非常感谢!
  • 不客气 - 如果您认为该问题已得到解答,请考虑单击复选标记,这样该问题将不再显示为未回答
【解决方案2】:

如果您不想要周围的数字或点并且忽略周围的点:

(?&lt;![.\d])\d+\.\d\d(?![\d.])

您可以随时添加到类中以忽略任何其他不想要的characters

但如果你走那条路,你可能需要空白边界。

(?&lt;!\S)\d+\.\d\d(?!\S)

这更有效。

【讨论】:

  • pastebin.com/2SWGUdfg 给我错误(PHP)
  • @SpectrumCodeFrom - 这里没有错误,请选择:(?<![.\d])\d+\.\d\d(?![\d.])(?<!\S)\d+\.\d\d(?!\S)。不过,一定要知道如何在使用 Php 分隔符时转义正则表达式。我的软件会自动执行,我从没想过。
  • @SpectrumCodeFrom 您缺少 php 中的分隔符 preg_match_all('/(?&lt;!\S)\d+\.\d\d(?!\S)/', $content, $matches); 请参阅 3v4l.org/mA0E9
猜你喜欢
  • 1970-01-01
  • 2012-11-30
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 2015-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多