我有一个字符串:
$str1 = "12 ounces";
$str2 = "1.5 ounces chopped;
我想从字符串中获取数量,无论是否为小数(12或1.5),然后获取前一个测量值(盎司)。
我能够使用一个非常基本的正则表达式来获取测量结果,但获得十进制/整数一直给我带来了问题。
感谢您的帮助!
答案 0 :(得分: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*)?
:这将匹配并(隐式)断言整数部分中的至少一个数字,然后是可选 .
(需要使用{{1进行转义)因为\
表示任何字符)和小数部分(可以是0或更多数字)。可选性最后由.
表示。 ?
可用于分组和捕获 - 但如果不需要捕获,则()
可用于禁用捕获(节省内存)。(?:)
:这将匹配\.\d+
等案例。它与.78
匹配,后跟至少一个(由.
表示)。如果你想确保从输入字符串中获得有意义的东西,这不是一个好的解决方案。在编写仅捕获有效数据的正则表达式之前,需要定义所有预期单位。
答案 1 :(得分:1)
使用此正则表达式\b\d+([\.,]\d+)?
答案 2 :(得分:0)
要获得使用逗号或点加下一个单词的整数和小数,请使用以下正则表达式:
/\d+([\.,]\d+)?\s\S+/