Oracle REGEXP_SUBSTR前瞻和后瞻

时间:2019-08-08 12:29:30

标签: regex oracle regexp-substr

我正在尝试编写一个正则表达式,该正则表达式从给定的文本中获取宽度和长度的最小值和最大值。 例如。我的一些示例文本如下。

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}

但是上面的正则表达式为所有4个参数(即minm_width,maxm_width,minm_length,maxm_length)返回null。

上面的正则表达式在RegEx Simulator上尝试时给出正确的值。 但是,当我使用REGEXP_SUBSTR在oracle上尝试正则表达式时,它将返回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;

在解决此问题方面提供了任何帮助。预先感谢。

1 个答案:

答案 0 :(得分:0)

以下正则表达式应给出您想要的结果:

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.参数对其进行引用。

将所有表达式的等号标记为可选,因为边界可能严格,也可能不严格。