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

时间:2012-07-16 08:20:20

标签: regex string integer decimal

我有一个字符串:

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

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

我能够使用一个非常基本的正则表达式来获取测量结果,但获得十进制/整数一直给我带来了问题。

感谢您的帮助!

3 个答案:

答案 0 :(得分:11)

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

([\d.]+)\s+(\S+)
  • ([\d.]+)[\d.]+将匹配一系列严格数字和.(表示4.5.6....将匹配,但这些情况不常见,这只是为了抓取数据),括号表示我们将捕获匹配的文本。这里的.位于字符类[]内,因此无需转义。

  • 后跟任意空格\s+和非空格字符\S+的最大序列(由于贪婪量词)(非空格实际上是非空格:它几乎可以匹配所有内容) Unicode,空格,制表符,换行符,回车符号除外。

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

你可以对这个数字更加严格:

(\d+(?:\.\d*)?|\.\d+)\s+(\S+)
  • 唯一的变化是(\d+(?:\.\d*)?|\.\d+),所以我只会解释这一部分。这有点严格,但根据输入域和您的要求,是否更严格更好。它将匹配整数34,带小数部分3.40000的数字,并允许.534.个案件通过。它会拒绝过多.的号码,或仅包含.|充当OR,将2种不同的模式分开:\.\d+\d+(?:\.\d*)?
  • \d+(?:\.\d*)?:这将匹配并(隐式)断言整数部分中的至少一个数字,然后是可选 .(需要使用{{1进行转义)因为\表示任何字符)和小数部分(可以是0或更多数字)。可选性最后由.表示。 ?可用于分组和捕获 - 但如果不需要捕获,则()可用于禁用捕获(节省内存)。
  • (?:):这将匹配\.\d+等案例。它与.78匹配,后跟至少一个(由.表示)。

如果你想确保从输入字符串中获得有意义的东西,这不是一个好的解决方案。在编写仅捕获有效数据的正则表达式之前,需要定义所有预期单位。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

/\d+([\.,]\d+)?\s\S+/