我有一个像这样的字符串:
$str1 = "12 ounces";
$str2 = "1.5 ounces chopped;
我想从字符串中获取金额,无论它是否是小数(12 或 1.5),然后获取紧邻的前一个测量值(盎司)。
我能够使用一个非常基本的正则表达式来获取测量值,但是获取小数/整数给我带来了问题。
如果你只是想抓取数据,你可以使用松散的正则表达式:
([\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
之类的情况。它匹配 .
后跟至少一位(由 +
表示)数字。如果您想确保从输入字符串中获得有意义的内容,这不是一个好的解决方案。您需要先定义所有预期单位,然后才能编写仅捕获有效数据的正则表达式。
使用这个正则表达式
\b\d+([\.,]\d+)?
要获取使用逗号或点加下一个单词的整数和小数,请使用以下正则表达式:
/\d+([\.,]\d+)?\s\S+/