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

HWD*_*HWD 4 regex string integer decimal

我有一个字符串:

$str1 = "12 ounces";
$str2 = "1.5 ounces chopped;
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢你的帮助!

nha*_*tdh 11

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

([\d.]+)\s+(\S+)
Run Code Online (Sandbox Code Playgroud)
  • ([\d.]+):[\d.]+将匹配的严格的数字序列和.(这意味着4.5.6....将匹配,但这些情况并不常见,而这仅仅是抓取数据),和括号,标志着我们将捕获匹配的文本.在.这里是字符类中[],所以没有必要逃跑.

  • 其次是任意空格\s+非空格字符和最大序列(由于贪婪量词)\S+(非空间真的是无空间:它会以Unicode几乎所有的匹配,除了空格,制表符,新行,回车符).

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

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

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

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