REGEXP\u SUBSTR Oracle与regext.com不同
我在用这个正则表达式REGEXP\u SUBSTR Oracle与regext.com不同,regex,oracle,oracle12c,Regex,Oracle,Oracle12c,我在用这个正则表达式 #([^\s]*)# (在C#和工作罚款中) 但是使用Oracle中的REGEXP\u SUBSTR,我得到了一个不同的结果 SELECT REGEXP_SUBSTR('test #2 #123456789# #blabla #1','#([^#\s]*)#') from dual Oracle=#2# C#/regexr.com=#123456789# 有人知道如何在Oracle中获得相同的结果吗?您可以使用SUBSTR和INSTR的组合来获得所需的结果 查询 使用通
#([^\s]*)#
(在C#和工作罚款中)
但是使用Oracle中的REGEXP\u SUBSTR
,我得到了一个不同的结果
SELECT REGEXP_SUBSTR('test #2 #123456789# #blabla #1','#([^#\s]*)#') from dual
Oracle=#2#
C#/regexr.com=#123456789#
有人知道如何在Oracle中获得相同的结果吗?您可以使用
SUBSTR
和INSTR
的组合来获得所需的结果
查询
使用通俗易懂的英语,应该遵循哪些规则才能获得所需的结果?您需要
#([^.[:space:]]*)
[^.\s]
匹配的字符不是
或
或
或(而不是您期望的
或空白字符)。如果要匹配字符集中的空格,则需要使用POSIX表达式[:space://code>,而不是PERL\s
表达式。请描述如何返回结果?它是一个#
分隔的字符串,您试图返回第三个字段吗?@ejeged OP要求的行为与;此正则表达式正在两个不以空格字符分隔的连续#
之间查找子字符串。如前所述,这可以通过调整OP的查询来使用POSIX字符集[:space:]
或仅使用非贪婪正则表达式\S*?#
。这与硬编码不同,您需要第二个和第三个
之间的值。我对这个问题的解释是,字符串似乎是一个
分隔字符串,他们试图获取第三个字段。肯定需要问题作者的澄清。
WITH strings (str_val) AS (SELECT 'test #2 #123456789# #blabla #1' FROM DUAL)
SELECT SUBSTR (str_val,
instr(str_val, '#', 1,2),
instr(str_val, '#', 1,3) - instr(str_val, '#', 1,2) + 1)
FROM strings;