Oracle REGEXP_SUBSTR 前瞻和后瞻
Oracle REGEXP_SUBSTR Look-Ahead and Look-Behind
我正在尝试编写一个正则表达式,它从给定文本中获取宽度和长度的最小值和最大值。
例如。我有几个示例文本如下。
1. S-BARE-w<=1250;L<=4000
2. S-BARE-w<=1250;4000<L<=6500
3. S-BARE-1250<w<=1550;L<=4000
4. S-BARE-1250< w<=1550;4000<L<=6500
关于这个我需要获取最小值和最大值。我正在尝试使用 REGEXP_SUBSTR
来实现这一点。我正在使用以下带有匹配参数 i 和 x 的正则表达式。
我正在使用 4 个正则表达式字符串。 \d{4}(?=<W)
找到最小宽度,(?<=W<=)\d{4}
找到最大宽度,\d{4}(?=<L)
找到最小长度,(?<=L<=)\d{4}
找到最大长度。组合正则表达式如下
\d{4}(?=<W)|(?<=W<=)\d{4}|\d{4}(?=<L)|(?<=L<=)\d{4}
但是上面的正则表达式 returns 对于所有 4 个参数都是空的,即 minm_width、maxm_width、minm_length、maxm_length.
上面的这些正则表达式在 RegEx Simulator 上尝试时给出了正确的值。
但是当我用 REGEXP_SUBSTR
在 oracle 上尝试正则表达式时,它 returns NULL
。
Oracle语句如下。
WITH TEST_DATA AS
(SELECT 'S-BARE-w<=1250;L<=4000' TXT_REMARKS FROM DUAL
UNION SELECT 'S-BARE-w<=1250;4000<L<=6500' TXT_REMARKS FROM DUAL
UNION SELECT 'S-BARE-1250<w<=1550;L<=4000' TXT_REMARKS FROM DUAL
UNION SELECT 'S-BARE-1250<w<=1550;4000<L<=6500' TXT_REMARKS FROM DUAL)
SELECT TXT_REMARKS,
REGEXP_SUBSTR (TXT_REMARKS, '\d{4}(?=<W)', 1, 1, 'i') WIDTH_MIN,
REGEXP_SUBSTR (TXT_REMARKS, '(?<=W<=)\d{4}', 1, 1, 'i') WIDTH_MAX,
REGEXP_SUBSTR (TXT_REMARKS, '\d{4}(?=<L)', 1, 1, 'i') LENGTH_MIN,
REGEXP_SUBSTR (TXT_REMARKS, '(?<=L<=)\d{4}', 1, 1, 'i') LENGTH_MAX
FROM TEST_DATA;
如果您能帮助解决这个问题,我们将不胜感激。提前致谢。
以下正则表达式应该会给出您想要的结果:
WITH TEST_DATA AS
(SELECT 'S-BARE-w<=1250;L<=4000' TXT_REMARKS FROM DUAL
UNION SELECT 'S-BARE-w<=1250;4000<L<=6500' TXT_REMARKS FROM DUAL
UNION SELECT 'S-BARE-1250<w<=1550;L<=4000' TXT_REMARKS FROM DUAL
UNION SELECT 'S-BARE-1250<w<=1550;4000<L<=6500' TXT_REMARKS FROM DUAL)
SELECT TXT_REMARKS,
REGEXP_SUBSTR (TXT_REMARKS, '(\d+)<=?W', 1, 1, 'i',1) WIDTH_MIN,
REGEXP_SUBSTR (TXT_REMARKS, 'W<=?(\d+)', 1, 1, 'i',1) WIDTH_MAX,
REGEXP_SUBSTR (TXT_REMARKS, '(\d+)<=?L', 1, 1, 'i',1) LENGTH_MIN,
REGEXP_SUBSTR (TXT_REMARKS, 'L<=?(\d+)', 1, 1, 'i',1) LENGTH_MAX
FROM TEST_DATA;
你可以只用括号标记你想要得到的部分,然后用REGEXP_SUBSTR
的6.参数引用它们。
将等号标记为对所有表达式都是可选的,因为边界可能严格也可能不严格。
我正在尝试编写一个正则表达式,它从给定文本中获取宽度和长度的最小值和最大值。 例如。我有几个示例文本如下。
1. S-BARE-w<=1250;L<=4000
2. S-BARE-w<=1250;4000<L<=6500
3. S-BARE-1250<w<=1550;L<=4000
4. S-BARE-1250< w<=1550;4000<L<=6500
关于这个我需要获取最小值和最大值。我正在尝试使用 REGEXP_SUBSTR
来实现这一点。我正在使用以下带有匹配参数 i 和 x 的正则表达式。
我正在使用 4 个正则表达式字符串。 \d{4}(?=<W)
找到最小宽度,(?<=W<=)\d{4}
找到最大宽度,\d{4}(?=<L)
找到最小长度,(?<=L<=)\d{4}
找到最大长度。组合正则表达式如下
\d{4}(?=<W)|(?<=W<=)\d{4}|\d{4}(?=<L)|(?<=L<=)\d{4}
但是上面的正则表达式 returns 对于所有 4 个参数都是空的,即 minm_width、maxm_width、minm_length、maxm_length.
上面的这些正则表达式在 RegEx Simulator 上尝试时给出了正确的值。
但是当我用 REGEXP_SUBSTR
在 oracle 上尝试正则表达式时,它 returns NULL
。
Oracle语句如下。
WITH TEST_DATA AS
(SELECT 'S-BARE-w<=1250;L<=4000' TXT_REMARKS FROM DUAL
UNION SELECT 'S-BARE-w<=1250;4000<L<=6500' TXT_REMARKS FROM DUAL
UNION SELECT 'S-BARE-1250<w<=1550;L<=4000' TXT_REMARKS FROM DUAL
UNION SELECT 'S-BARE-1250<w<=1550;4000<L<=6500' TXT_REMARKS FROM DUAL)
SELECT TXT_REMARKS,
REGEXP_SUBSTR (TXT_REMARKS, '\d{4}(?=<W)', 1, 1, 'i') WIDTH_MIN,
REGEXP_SUBSTR (TXT_REMARKS, '(?<=W<=)\d{4}', 1, 1, 'i') WIDTH_MAX,
REGEXP_SUBSTR (TXT_REMARKS, '\d{4}(?=<L)', 1, 1, 'i') LENGTH_MIN,
REGEXP_SUBSTR (TXT_REMARKS, '(?<=L<=)\d{4}', 1, 1, 'i') LENGTH_MAX
FROM TEST_DATA;
如果您能帮助解决这个问题,我们将不胜感激。提前致谢。
以下正则表达式应该会给出您想要的结果:
WITH TEST_DATA AS
(SELECT 'S-BARE-w<=1250;L<=4000' TXT_REMARKS FROM DUAL
UNION SELECT 'S-BARE-w<=1250;4000<L<=6500' TXT_REMARKS FROM DUAL
UNION SELECT 'S-BARE-1250<w<=1550;L<=4000' TXT_REMARKS FROM DUAL
UNION SELECT 'S-BARE-1250<w<=1550;4000<L<=6500' TXT_REMARKS FROM DUAL)
SELECT TXT_REMARKS,
REGEXP_SUBSTR (TXT_REMARKS, '(\d+)<=?W', 1, 1, 'i',1) WIDTH_MIN,
REGEXP_SUBSTR (TXT_REMARKS, 'W<=?(\d+)', 1, 1, 'i',1) WIDTH_MAX,
REGEXP_SUBSTR (TXT_REMARKS, '(\d+)<=?L', 1, 1, 'i',1) LENGTH_MIN,
REGEXP_SUBSTR (TXT_REMARKS, 'L<=?(\d+)', 1, 1, 'i',1) LENGTH_MAX
FROM TEST_DATA;
你可以只用括号标记你想要得到的部分,然后用REGEXP_SUBSTR
的6.参数引用它们。
将等号标记为对所有表达式都是可选的,因为边界可能严格也可能不严格。