Regex 正则表达式if-else表达式

Regex 正则表达式if-else表达式,regex,oracle,oracle10g,Regex,Oracle,Oracle10g,我试图使用Oracle的REGEXP\u SUBSTR函数从文本字段中提取分钟数 数据: 在每种情况下,我都希望提取字符串的“15”部分 尝试: \d+获取所有数值,包括“7”和“1”,这是不需要的。 \d+?=\?min从除最后一行之外的所有行中获取“15”。 条件语句?\d+?=\?min\d+?=\?min\d+,与任何内容都不匹配。 我的条件语句有什么问题 **编辑** WITH DATA AS ( SELECT 'Treatment of PC7, PT1 on left. 15

我试图使用Oracle的REGEXP\u SUBSTR函数从文本字段中提取分钟数

数据:

在每种情况下,我都希望提取字符串的“15”部分

尝试:

\d+获取所有数值,包括“7”和“1”,这是不需要的。 \d+?=\?min从除最后一行之外的所有行中获取“15”。 条件语句?\d+?=\?min\d+?=\?min\d+,与任何内容都不匹配。 我的条件语句有什么问题

**编辑**

WITH DATA AS (

  SELECT 'Treatment of PC7, PT1 on left. 15 min.' COMMENTS FROM DUAL

  UNION ALL

  SELECT '15 minutes.' COMMENTS FROM DUAL

  UNION ALL

  SELECT '15 minutes' COMMENTS FROM DUAL

  UNION ALL

  SELECT '15 mins.' COMMENTS FROM DUAL

  UNION ALL

  SELECT '15 mins' COMMENTS FROM DUAL

  UNION ALL

  SELECT '15 min.' COMMENTS FROM DUAL

  UNION ALL

  SELECT '15 min' COMMENTS FROM DUAL

  UNION ALL

  SELECT '15min' COMMENTS FROM DUAL

  UNION ALL

  SELECT '15' COMMENTS FROM DUAL

)

SELECT  COMMENTS,
        REGEXP_SUBSTR(COMMENTS, '(\d+)\s?(?:min.*)?$', 1, 1) A,
        REGEXP_SUBSTR(COMMENTS, '\d+?(?= ?min)|^\d+$', 1, 1) B,
        REGEXP_SUBSTR(COMMENTS, '\d+?(?: ?min)|^\d+$', 1, 1) C

FROM DATA
结果必须有一种比“代码示例”更好的列格式:

COMMENTS A B C
Treatment of PC7, PT1 on left. 15 min.          
15 minutes.         
15 minutes          
15 mins.            
15 mins         
15 min.         
15 min          
15min           
15  15  15  15

这个正则表达式对你有用

^.*?(\d+)(( ?min.*$)|$)
解释

^.*? - 匹配字符串的开头,后跟任意字符0次或多次 \d+-至少匹配一个数字,并将其存储在反向参考位置1 ?min.*$-匹配一个空格,可能是min,可能是任何字符,然后是字符串的结尾。 …|$-如果找不到min,它将查看是否有字符串的结尾。 然后,不要使用REGEXP\u SUBSTR,而是像这样使用REGEXP\u REPLACE,将整个字符串替换为存储在backreference位置1中的数字:

REGEXP_REPLACE(COMMENTS, '^.*?(\d+)(( ?min.*$)|$)', '\1') A

这个正则表达式对你有用

^.*?(\d+)(( ?min.*$)|$)
解释

^.*? - 匹配字符串的开头,后跟任意字符0次或多次 \d+-至少匹配一个数字,并将其存储在反向参考位置1 ?min.*$-匹配一个空格,可能是min,可能是任何字符,然后是字符串的结尾。 …|$-如果找不到min,它将查看是否有字符串的结尾。 然后,不要使用REGEXP\u SUBSTR,而是像这样使用REGEXP\u REPLACE,将整个字符串替换为存储在backreference位置1中的数字:

REGEXP_REPLACE(COMMENTS, '^.*?(\d+)(( ?min.*$)|$)', '\1') A

如果您可以保证时间戳始终显示为字符串的最后一部分,则可以这样做:

(\d+)\s?(?:min.*)?$

我不知道Oracle是否支持非捕获组,但这很容易解决。我的经验是,它的RegExp引擎仅限于普通的内容。

如果您可以保证时间戳始终显示为字符串的最后一部分,则此方法有效:

(\d+)\s?(?:min.*)?$

我不知道Oracle是否支持非捕获组,但这很容易解决。我的经验是,它的RegExp引擎仅限于非常普通的内容。

使用多个表达式的替代工作解决方案:

TO_NUMBER(
    CASE
        -- number only
        WHEN LENGTH( REGEXP_SUBSTR(MEAS_COMMENT, '^\d+$', 1, 1) ) >0 THEN REGEXP_SUBSTR(MEAS_COMMENT, '^\d+$', 1, 1)
        -- XX min
        WHEN LENGTH( REGEXP_SUBSTR(MEAS_COMMENT, '\d+( ?min)', 1, 1) ) >0 THEN REGEXP_SUBSTR(REGEXP_SUBSTR(MEAS_COMMENT, '\d+( ?min)', 1, 1), '\d+', 1, 1)
    END
) MINUTES
**编辑**

-- same results without the `CASE` statement:
TO_NUMBER( REGEXP_SUBSTR(REGEXP_SUBSTR(COMMENTS, '(\d+)( ?min|$)', 1, 1), '\d+', 1, 1) )

使用多个表达式的备选工作解决方案:

TO_NUMBER(
    CASE
        -- number only
        WHEN LENGTH( REGEXP_SUBSTR(MEAS_COMMENT, '^\d+$', 1, 1) ) >0 THEN REGEXP_SUBSTR(MEAS_COMMENT, '^\d+$', 1, 1)
        -- XX min
        WHEN LENGTH( REGEXP_SUBSTR(MEAS_COMMENT, '\d+( ?min)', 1, 1) ) >0 THEN REGEXP_SUBSTR(REGEXP_SUBSTR(MEAS_COMMENT, '\d+( ?min)', 1, 1), '\d+', 1, 1)
    END
) MINUTES
**编辑**

-- same results without the `CASE` statement:
TO_NUMBER( REGEXP_SUBSTR(REGEXP_SUBSTR(COMMENTS, '(\d+)( ?min|$)', 1, 1), '\d+', 1, 1) )


我没有看到任何if-else语句。显示实际代码,而不是摘要。Oracle的regexp函数是否支持条件构造?@AndyLester,最后一点是“if else”表达式,至少根据@Xophmeister:我需要研究一下。根据奥斯特的回答,可能不是。我看不出任何if-else的说法。显示实际代码,而不是摘要。Oracle的regexp函数是否支持条件构造?@AndyLester,最后一点是“if else”表达式,至少根据@Xophmeister:我需要研究一下。根据奥斯特的回答,可能不是。我试过你的表情;它在所有情况下都有效,但最后的“15”。甲骨文一点也不喜欢这个表达式。@craig-我觉得字符串一次只能是其中一个。因此,如果测试的字符串仅为15,则与之匹配。你想同时匹配所有的吗?是的,它只会是其中的一个。我纠正了我的测试,它在regexpal上工作。我必须研究一下Oracle是否支持条件句。@craig-好的,我很肯定他们支持条件句。如果你看这里,他们给出的第一个例子是f | https?:显然Oracle支持POSIX ERE regexp:So?作为量词是可以的,但它不会做环顾断言之类的事情,这可能就是@Aust的regexp不适合您的原因;它在所有情况下都有效,但最后的“15”。甲骨文一点也不喜欢这个表达式。@craig-我觉得字符串一次只能是其中一个。因此,如果测试的字符串仅为15,则与之匹配。你想同时匹配所有的吗?是的,它只会是其中的一个。我纠正了我的测试,它在regexpal上工作。我必须研究一下Oracle是否支持条件句。@craig-好的,我很肯定他们支持条件句。如果你看这里,他们给出的第一个例子是f | https?:显然Oracle支持POSIX ERE regexp:So?作为一个量词是可以的,但它不会做环顾断言之类的事情,这可能就是@Aust的regexp不适合您的原因。+1-我同意。如果保证时间戳在末尾,这会更好。+1-我同意。如果能保证时间戳在末尾,这就更好了。