Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
包含新行字符的字符串中的Oracle regexp匹配模式_Regex_Oracle - Fatal编程技术网

包含新行字符的字符串中的Oracle regexp匹配模式

包含新行字符的字符串中的Oracle regexp匹配模式,regex,oracle,Regex,Oracle,我正在尝试根据匹配的表达式拆分字符串。请注意,这包括换行符 下面是我的问题 with base aS( select 'sam s123 565 q2# nicole s1257 546 q4# mary s568 545' str1 from dual ) select regexp_substr(str1, '[^q[:digit:]]#+', 1, level, 'm') as split from base conne

我正在尝试根据匹配的表达式拆分字符串。请注意,这包括换行符

下面是我的问题

with base aS(
      select 
      'sam s123 565 q2#
      nicole s1257 546 q4#
      mary s568 545' str1
      from dual
)
select regexp_substr(str1, '[^q[:digit:]]#+', 1, level, 'm') as split
  from base
  connect by level <= regexp_count(str1, '[^q[:digit:]]#+')

谢谢

将正则表达式更改为此

(.?+) -- any one or more characters. Put this in brackets as first subexpression
q     -- letter q
\d+   -- one or more digits
#     -- character #
并在REGEXP_SUBSTR函数中再包含一个paraemter,以仅提取第一个子表达式。使用“修剪”删除空格

WITH base AS (SELECT 'sam s123 565 q2#
      nicole s1257 546 q4#
      mary s568 545' str1 FROM DUAL)
    SELECT TRIM (REGEXP_SUBSTR (str1,
                                '(.?+)q\d+#',
                                1,
                                LEVEL,
                                'm',
                                1       --first subexpression
                               )
                )
              AS split
      FROM base
CONNECT BY LEVEL <= REGEXP_COUNT (str1, '(.?+)q\d+#');

因为第三行没有匹配的模式,所以它不会返回该模式。

谢谢,但是如果上面提到的字符串不是多行的,那么这将不起作用。所以,这可能需要被放入一个程序中。
WITH base AS (SELECT 'sam s123 565 q2#
      nicole s1257 546 q4#
      mary s568 545' str1 FROM DUAL)
    SELECT TRIM (REGEXP_SUBSTR (str1,
                                '(.?+)q\d+#',
                                1,
                                LEVEL,
                                'm',
                                1       --first subexpression
                               )
                )
              AS split
      FROM base
CONNECT BY LEVEL <= REGEXP_COUNT (str1, '(.?+)q\d+#');
split
-------------
sam s123 565
nicole s1257 546