我有下表:
CREATE TABLE test_regex (
drug TEXT
);
INSERT INTO test_regex
VALUES
('DRUGA 200 MG'),
('DRUGB 150 MCG'),
('DRUGC 1.5 GM BOX'),
('DRUGD 27.2 MG/5 ML VIAL')
;
我想提取以下内容:
200 MG
150 MCG
1.5 GM
27.2 MG
到目前为止,我尝试了以下几点:
SELECT
substring(drug, '[0-9]*\.?[0-9]* MG|GM|MCG')
FROM
test_regex
;
这会导致:
200 MG
MCG
GM
27.2 MG
我也尝试过:
SELECT
substring(drug, '[0-9]*\.?[0-9]* (MG|GM|MCG)')
FROM
test_regex
;
结果如下:
MG
MCG
GM
MG
我认为问题在于如何处理尾随的(MG|GM|MCG)
组,但我在PostgreSQL文档中找不到我想要的东西。我希望得到第一个数字部分,然后是一个空格,然后是MG、GM或MCG。我认为它被归类为带有MG的数字表达式,然后是GM或MCG。
发布于 2018-07-26 07:24:15
主要思想是,您需要将应在字符串中的同一位置匹配的备选方案分组。另外,我建议使用单词边界将字符串作为整个单词进行匹配。
另请注意,如果存在以下匹配,则substring
仅返回捕获组捕获的那部分匹配:
如果模式包含任何括号,则返回与第一个带括号的子表达式匹配的文本部分(左括号在前的子表达式)。
因此,您可以使用的分组构造是一个non-capturing group,(?:...|...)
。
您可以使用
substring(drug, '\m[0-9]*\.?[0-9]+\s*(?:MG|GM|MCG)\M')
请参阅online demo。
Pattern details
\m
- word[0-9]*
的开始-零个或更多的digits\.?
-一个可选的.
[0-9]+
-word[0-9]*
whitespaces(?:MG|GM|MCG)
- efficient)\M
- 1+ digits\s*
- MG
,或者GM
或MCG
(您可以将其编写为(?:MC?G|GM)
,使其更具efficient)\M
-1+ of 0+。
https://stackoverflow.com/questions/51528906
复制相似问题