4

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

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

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

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

谢谢你的帮助!

4

3 回答 3

11

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

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

  • 后跟任意空格\s+和非空格字符的最大序列(由于贪心量词)\S+(非空格真的是非空格:它将匹配 Unicode 中的几乎所有内容,除了空格、制表符、换行符、回车符)。

您可以获取第一个捕获组中的编号,以及第二个捕获组中的单元。

您可以对数字更严格一些:

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

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

于 2012-07-16T08:24:04.353 回答
4

使用这个正则表达式\b\d+([\.,]\d+)?

于 2012-07-16T08:28:15.390 回答
0

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

/\d+([\.,]\d+)?\s\S+/
于 2012-07-16T12:41:13.803 回答