正则表达式查找字符串中的整数和小数

问题描述 投票:0回答:3

我有一个像这样的字符串:

$str1 = "12 ounces";
$str2 = "1.5 ounces chopped;

我想从字符串中获取金额,无论它是否是小数(12 或 1.5),然后获取紧邻的前一个测量值(盎司)。

我能够使用一个非常基本的正则表达式来获取测量值,但是获取小数/整数给我带来了问题。

regex string integer decimal
3个回答
11
投票

如果你只是想抓取数据,你可以使用松散的正则表达式:

([\d.]+)\s+(\S+)
  • ([\d.]+)
    [\d.]+
    将匹配一系列严格的数字和
    .
    (这意味着
    4.5.6
    ....
    将匹配,但这些情况并不常见,这只是为了抓取数据),并且括号表示我们将捕获匹配的文本。这里的
    .
    在字符类
    []
    内部,所以不需要转义。

  • 后跟任意空格

    \s+
    和非空格字符的最大序列(由于贪婪量词)
    \S+
    (非空格确实是非空格:它将匹配Unicode中的几乎所有内容,除了空格,制表符,新行,回车符)。

您可以获取第一个捕获组中的数字,以及第二个捕获组中的单位。

你可以在数量上严格一点:

(\d+(?:\.\d*)?|\.\d+)\s+(\S+)
  • 唯一的改变是
    (\d+(?:\.\d*)?|\.\d+)
    ,所以我只解释这部分。这有点严格,但是否更严格更好取决于输入域和您的要求。它将匹配整数
    34
    、带有小数部分
    3.40000
    的数字,并允许
    .5
    34.
    情况通过。它将拒绝带有过多
    .
    的数字,或仅包含
    .
    的数字。
    |
    充当 OR,分隔 2 个不同的模式:
    \.\d+
    \d+(?:\.\d*)?
  • \d+(?:\.\d*)?
    :这将匹配并(隐式)断言整数部分中至少一位数字,后跟 可选
    .
    (需要用
    \
    转义,因为
    .
    表示任何字符)和小数部分(可以是 0 个或多个数字)。可选性由末尾的
    ?
    表示。
    ()
    可用于分组和捕获 - 但如果不需要捕获,则
    (?:)
    可用于禁用捕获(节省内存)。
  • \.\d+
    :这将匹配诸如
    .78
    之类的情况。它匹配
    .
    后跟至少一位(由
    +
    表示)数字。

如果您想确保从输入字符串中获得有意义的内容,这不是一个好的解决方案。您需要先定义所有预期单位,然后才能编写仅捕获有效数据的正则表达式。


4
投票

使用这个正则表达式

\b\d+([\.,]\d+)?


0
投票

要获取使用逗号或点加下一个单词的整数和小数,请使用以下正则表达式:

/\d+([\.,]\d+)?\s\S+/
© www.soinside.com 2019 - 2024. All rights reserved.