【问题标题】:Oracle REGEXP_SUBSTR Look-Ahead and Look-BehindOracle REGEXP_SUBSTR 前瞻和后瞻
【发布时间】:2019-08-08 20:39:05
【问题描述】:

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

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}(?=&lt;W) 找到最小宽度,(?&lt;=W&lt;=)\d{4} 找到最大宽度,\d{4}(?=&lt;L) 找到最小长度,(?&lt;=L&lt;=)\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;

感谢您提供解决此问题的任何帮助。提前致谢。

【问题讨论】:

    标签: regex oracle regexp-substr


    【解决方案1】:

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

    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.参数引用它们。

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

    【讨论】:

    • 非常感谢.. 解决了它。虽然有另一个查询。为什么在模拟器中也能做到这一点,而在 oracle 中却不行?
    • Oracle 的正则表达式引擎不支持前瞻或后瞻:-/
    猜你喜欢
    • 2022-01-12
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    相关资源
    最近更新 更多