【问题标题】:Regex for substring of comma separated list逗号分隔列表的子字符串的正则表达式
【发布时间】:2019-09-13 07:11:03
【问题描述】:

我是正则表达式的初学者,所以如果这是一个幼稚的问题,我提前道歉!

我有一个用逗号分隔的两个值的字符串:12.345678,23.45678901

我正在尝试使用正则表达式(这是一项要求)来返回第一个带有 3 个小数的值 12.345 和第二个带有 2 个小数的值 23.45

理想情况下,完整的正则表达式匹配是12.345,23.45

我可以使用以下正则表达式获得第一个值 12.345:^\d+\.\d{0,3}

这很有效,因为它只返回完整匹配(没有第 1 组匹配)。但是我很困惑如何让第二个值 23.45 在同一个字符串中返回。

我也试过这个正则表达式: (^.{0,6})(?:.*)(,)(.{0,5}),它正确解析了第一个和第二个值,但返回的完整匹配项带有太多小数。

完整匹配:12.345678,23.45

第一组:12.345

第 2 组:,

第 3 组:23.45

欢迎提出任何建议!先感谢您。

【问题讨论】:

  • 你试过explode()吗?
  • 正如 Hemant 所提到的,我觉得将字符串按, 拆分,然后根据您的格式输出数据将产生可读和可维护的代码。
  • 不幸的是不能爆炸()。我可以将正则表达式添加为配置,但我无法更新 php 代码本身。

标签: php regex pcre


【解决方案1】:

您可以使用此正则表达式来获取您的数据:

^(\d+\.\d{3})\d*,(\d+\.\d{2})\d*$

它查找后跟 . 和 3 个小数位的数字(第一个捕获组),然后是一些数字后跟一个逗号(丢弃),然后是数字后跟一个 . 和 2 个小数位(第二个捕获组),最后是一些数字和字符串的结尾(丢弃)。

在 PHP 中使用

$str = '12.345678,23.45678901';
preg_match('/^(\d+\.\d{3})\d*,(\d+\.\d{2})\d*$/', $str, $matches);
echo "first number: {$matches[1]}\nsecond number: {$matches[2]}\n";

输出:

first number: 12.345 
second number: 23.45

Demo on 3v4l.org

如果您需要在$matches[0] 数组中获取两个匹配项(使用preg_match_all),您可以使用这个正则表达式:

(?<=^)\d+\.\d{3}(?=\d*,)|(?<=,)\d+\.\d{2}(?=\d*$)

此正则表达式查找任一

  • 字符串的开头后跟一些数字、. 和 3 位数字(后跟一些数字和逗号);或
  • 一个逗号、一些数字、一个. 和 2 个数字(后跟一些数字和字符串的结尾)。

为避免捕获不需要的数据,它使用正向前瞻和后向检查。

Demo on 3v4l.org

【讨论】:

  • 非常感谢快速而有帮助的回复!有没有办法更新那个正则表达式来做同样的事情,但是在一个带有多余括号和/或引号的字符串中?也就是说,如果原始字符串改为 [["12.345678,23.45678901"]] 并且我希望输出为 12.345 和 23.45?
  • @mazziestar 您可以通过删除字符串锚的开头和结尾来使其工作。请参阅此更新的演示 3v4l.org/QMdKR
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多