regexp_substr跳过空位置
使用此代码返回管道分隔字符串中的第n个值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||
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-这是一种享受。非常感谢您抽出时间,也感谢其他人抽出时间。非常感谢