[英]How to regex match multiple items
我有一个reviews
表如下:
r_id | 评论 |
---|---|
1 | 重量不能超过 40 公斤 |
2 | 您不得使重量 go 超过 31 公斤 |
3 | 不要excel 94kg以上 |
4 | 最佳重量为 45 公斤 |
5 | 不要excel 62公斤以上 |
6 | 重量不能超过7000g |
我想要 select 是r_id
不能超过的重量。 所以我想要的 output 是
r_id | 最大重量 |
---|---|
1 | 40 |
2 | 31 |
3 | 94 |
5 | 62 |
如您所见,不包括r_id
4,因为它没有达到最大重量,并且不包括6
,因为它以克为单位。 我正在为两件事而苦苦挣扎。
OR
运算符检查。kg
数写成 40 40kg
、 40 KG
公斤、 40 kg
或 40 40kilos
。 虽然所有事物都是kilograms
,但kg
的书写方式不同。 我怎样才能只提取数字(但确保kg
以上述方式之一写入,所以我不会意外提取4000g
之类的东西。SELECT
r_id,
REGEX_SUBSTR(REGEX_SUBSTR('cannot exceed [0-9]+ kg'), '[0-9]+ kg')) as "max weight"
FROM reviews;
我的陈述只检查一种特定类型的句子,不检查数字是否以公斤为单位。
您可以从字符串中提取数字。 似乎只有一个,然后检查字符串是否看起来像某些模式:
select regexp_substr(comm, '[0-9]+')
from reviews
where regexp_like(comm, '(exceed|go over|above).*[0-9]+ ?(kg|k.g)');
这是一个 db<>fiddle。
您可以使用更强大的正则表达式来提取数字。
我没有 oracle DB,但尝试类似:
SELECT
r_id,
REGEX_SUBSTR(comment, '([0-9]+) ?(k\.?g\.?|kilos)', 1, 1, 'i') as "max weight"
FROM reviews;
您可以在https://regex101.com/r/07Rstk/1看到此正则表达式与给定字符串匹配。 这也解释了正则表达式的含义。
我们还打开不区分大小写的标志,以便正确处理任何大小写。 https://docs.oracle.com/cd/E18283_01/olap.112/e17122/dml_functions_2069.htm
编辑:要检查是否超出,go 等。请注意,我们已将 position 参数从 1 更改为 2,因为我们现在关心第二个捕获组。
SELECT
r_id,
REGEX_SUBSTR(comment, '(exceed|go over|above)\h*([0-9]+) ?(k\.?g\.?|kilos)', 1, 2, 'i') as "max weight"
FROM reviews;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.