Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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
regexp_substr跳过空位置_Regex_Oracle_Plsql - Fatal编程技术网

regexp_substr跳过空位置

regexp_substr跳过空位置,regex,oracle,plsql,Regex,Oracle,Plsql,使用此代码返回管道分隔字符串中的第n个值 regexp_substr(int_record.interfaceline, '[^|]+', 1, i) 当所有值都存在时,它工作正常 Mike |男|是| 20000 |是,因此第三个值是正确的 但是如果字符串是 迈克|男| | 20000 |是的,第三个值是20000不是我想要的 如何告诉表达式不要跳过空值 短暂性脑缺血发作 迈克好的。这应该是您的最佳解决方案 SELECT REGEXP_REPLACE ( 'Mike|Male||

使用此代码返回管道分隔字符串中的第n个值

regexp_substr(int_record.interfaceline, '[^|]+', 1, i)
当所有值都存在时,它工作正常

Mike |男|是| 20000 |是,因此第三个值是正确的

但是如果字符串是

迈克|男| | 20000 |是的,第三个值是20000不是我想要的

如何告诉表达式不要跳过空值

短暂性脑缺血发作


迈克

好的。这应该是您的最佳解决方案

SELECT
      REGEXP_REPLACE ( 'Mike|Male||20000|Yes',
                    '^([^|]*\|){2}([^|]*).*$',
                    '\2' )
          TEXT
FROM
      DUAL;
那你的问题呢

SELECT
      REGEXP_REPLACE ( INCOMINGSTREAMOFSTRINGS,
                    '^([^|]*\|){N-1}([^|]*).*$',
                    '\2' )
          TEXT
FROM
      DUAL;
-INCOMINGSTREAMOFSTRINGS是带分隔符的完整字符串

-你应该通过n-1获得第n个位置

备选案文2:

WITH T AS (SELECT 'Mike|Male||20000|Yes' X FROM DUAL)
SELECT
      X,
      REGEXP_REPLACE ( X,
                    '^([^|]*).*$',
                    '\1' )
          Y1,
      REGEXP_REPLACE ( X,
                    '^[^|]*\|([^|]*).*$',
                    '\1' )
          Y2,
      REGEXP_REPLACE ( X,
                    '^([^|]*\|){2}([^|]*).*$',
                    '\2' )
          Y3,
      REGEXP_REPLACE ( X,
                    '^([^|]*\|){3}([^|]*).*$',
                    '\2' )
          Y4,
      REGEXP_REPLACE ( X,
                    '^([^|]*\|){4}([^|]*).*$',
                    '\2' )
          Y5
FROM
      T;
备选案文3:

SELECT
      REGEXP_SUBSTR ( REGEXP_REPLACE ( 'Mike|Male||20000|Yes',
                                '\|',
                                ';' ),
                   '(^|;)([^;]*)',
                   1,
                   1,
                   NULL,
                   2 )
          AS FIRST,
      REGEXP_SUBSTR ( REGEXP_REPLACE ( 'Mike|Male||20000|Yes',
                                '\|',
                                ';' ),
                   '(^|;)([^;]*)',
                   1,
                   2,
                   NULL,
                   2 )
          AS SECOND,
      REGEXP_SUBSTR ( REGEXP_REPLACE ( 'Mike|Male||20000|Yes',
                                '\|',
                                ';' ),
                   '(^|;)([^;]*)',
                   1,
                   3,
                   NULL,
                   2 )
          AS THIRD,
      REGEXP_SUBSTR ( REGEXP_REPLACE ( 'Mike|Male||20000|Yes',
                                '\|',
                                ';' ),
                   '(^|;)([^;]*)',
                   1,
                   4,
                   NULL,
                   2 )
          AS FOURTH,
      REGEXP_SUBSTR ( REGEXP_REPLACE ( 'Mike|Male||20000|Yes',
                                '\|',
                                ';' ),
                   '(^|;)([^;]*)',
                   1,
                   5,
                   NULL,
                   2 )
          AS FIFTH
FROM
      DUAL;

嗯。这应该是您的最佳解决方案

SELECT
      REGEXP_REPLACE ( 'Mike|Male||20000|Yes',
                    '^([^|]*\|){2}([^|]*).*$',
                    '\2' )
          TEXT
FROM
      DUAL;
那你的问题呢

SELECT
      REGEXP_REPLACE ( INCOMINGSTREAMOFSTRINGS,
                    '^([^|]*\|){N-1}([^|]*).*$',
                    '\2' )
          TEXT
FROM
      DUAL;
-INCOMINGSTREAMOFSTRINGS是带分隔符的完整字符串

-你应该通过n-1获得第n个位置

备选案文2:

WITH T AS (SELECT 'Mike|Male||20000|Yes' X FROM DUAL)
SELECT
      X,
      REGEXP_REPLACE ( X,
                    '^([^|]*).*$',
                    '\1' )
          Y1,
      REGEXP_REPLACE ( X,
                    '^[^|]*\|([^|]*).*$',
                    '\1' )
          Y2,
      REGEXP_REPLACE ( X,
                    '^([^|]*\|){2}([^|]*).*$',
                    '\2' )
          Y3,
      REGEXP_REPLACE ( X,
                    '^([^|]*\|){3}([^|]*).*$',
                    '\2' )
          Y4,
      REGEXP_REPLACE ( X,
                    '^([^|]*\|){4}([^|]*).*$',
                    '\2' )
          Y5
FROM
      T;
备选案文3:

SELECT
      REGEXP_SUBSTR ( REGEXP_REPLACE ( 'Mike|Male||20000|Yes',
                                '\|',
                                ';' ),
                   '(^|;)([^;]*)',
                   1,
                   1,
                   NULL,
                   2 )
          AS FIRST,
      REGEXP_SUBSTR ( REGEXP_REPLACE ( 'Mike|Male||20000|Yes',
                                '\|',
                                ';' ),
                   '(^|;)([^;]*)',
                   1,
                   2,
                   NULL,
                   2 )
          AS SECOND,
      REGEXP_SUBSTR ( REGEXP_REPLACE ( 'Mike|Male||20000|Yes',
                                '\|',
                                ';' ),
                   '(^|;)([^;]*)',
                   1,
                   3,
                   NULL,
                   2 )
          AS THIRD,
      REGEXP_SUBSTR ( REGEXP_REPLACE ( 'Mike|Male||20000|Yes',
                                '\|',
                                ';' ),
                   '(^|;)([^;]*)',
                   1,
                   4,
                   NULL,
                   2 )
          AS FOURTH,
      REGEXP_SUBSTR ( REGEXP_REPLACE ( 'Mike|Male||20000|Yes',
                                '\|',
                                ';' ),
                   '(^|;)([^;]*)',
                   1,
                   5,
                   NULL,
                   2 )
          AS FIFTH
FROM
      DUAL;

regexp_substr的工作方式如下:

如果出现次数大于1,则数据库将搜索 第二次出现,以字符后面的第一个字符开始 模式的首次出现,等等。这种行为是不同的 从SUBSTR函数开始搜索第二个 出现在第一个出现的第二个字符处

因此模式[^ |]将查找非管道,这意味着它将跳过连续管道| |查找非管道字符

您可以尝试:

select trim(regexp_substr(replace('A|test||string', '|', '| '), '[^|]+', 1, 4)) from dual;

这将用|替换|,并允许您基于模式[^ |]

regexp|u substr的工作方式如下:

如果出现次数大于1,则数据库将搜索 第二次出现,以字符后面的第一个字符开始 模式的首次出现,等等。这种行为是不同的 从SUBSTR函数开始搜索第二个 出现在第一个出现的第二个字符处

因此模式[^ |]将查找非管道,这意味着它将跳过连续管道| |查找非管道字符

您可以尝试:

select trim(regexp_substr(replace('A|test||string', '|', '| '), '[^|]+', 1, 4)) from dual;

这将用|替换|,并允许您基于模式[^ |]进行匹配。

您可以使用以下选项:

with l as (select 'Mike|Male||20000|Yes' str from dual)
select regexp_substr(str,'(".*"|[^|]*)(\||$)',1,level,null,1) 
from dual,l 
where level=3/*use any position*/ connect by level <= regexp_count(str,'([^|]*)(\||$)')

您可以使用以下选项:

with l as (select 'Mike|Male||20000|Yes' str from dual)
select regexp_substr(str,'(".*"|[^|]*)(\||$)',1,level,null,1) 
from dual,l 
where level=3/*use any position*/ connect by level <= regexp_count(str,'([^|]*)(\||$)')

作为@tbone响应的补充

<奇怪的是,我的神谕没有认出这个列表中的空白字符: 在这种情况下,可能会令人困惑,很难意识到出了什么问题。 尝试使用这个正则表达式[^ |]|+。此外,要检测可能的第一个空白项,最好在其之前而不是之后用空格替换分隔符: |


作为@tbone响应的补充

<奇怪的是,我的神谕没有认出这个列表中的空白字符: 在这种情况下,可能会令人困惑,很难意识到出了什么问题。 尝试使用这个正则表达式[^ |]|+。此外,要检测可能的第一个空白项,最好在其之前而不是之后用空格替换分隔符: |


我的CSV文件也有类似的问题,因此我的分隔符是分号; 所以我从下面的一个表达式开始:

 select regexp_substr(';2;;4;', '[^;]+', 1, i) from dual 
让我从1迭代到5

当然,它也不起作用

为了得到空的部分,我只是说它们可能在开始时^;,或在中间;或在末尾;$。将所有这些结合在一起,可以得出:

select regexp_substr(';2;;4;', '[^;]+|^;|;;|;$', 1, i) from dual
信不信由你:我从1岁到5岁的测试都很有效

但我们不要忘记最后一个细节:通过这种方法,你可以得到;对于最初为空的字段。 下面几行展示了如何轻松地用空StringSnall替换它们:

第一阶段为

选择regexp_substr';2.4;', '[^;]+|^;|;;|;$', 1,2作为F从双


当F类似“%”时选择大小写然后从stage1结束,我对CSV文件也有类似的问题,因此我的分隔符是分号; 所以我从下面的一个表达式开始:

 select regexp_substr(';2;;4;', '[^;]+', 1, i) from dual 
让我从1迭代到5

当然,它也不起作用

为了得到空的部分,我只是说它们可能在开始时^;,或在中间;或在末尾;$。将所有这些结合在一起,可以得出:

select regexp_substr(';2;;4;', '[^;]+|^;|;;|;$', 1, i) from dual
信不信由你:我从1岁到5岁的测试都很有效

但我们不要忘记最后一个细节:通过这种方法,你可以得到;对于最初为空的字段。 下面几行展示了如何轻松地用空StringSnall替换它们:

第一阶段为

选择regexp_substr';2.4;', '[^;]+|^;|;;|;$', 1,2作为F从双


当F类似“%”时选择大小写然后从第1阶段结束

请编辑现有答案,不要创建多个答案。@realspirituals-这很有效。非常感谢您抽出时间,也感谢其他人抽出时间。非常感谢请编辑现有答案,不要创建多个答案。@realspirituals-这是一种享受。非常感谢您抽出时间,也感谢其他人抽出时间。非常感谢