我需要从“*”的第三个位置获取数据到第四个。我这样做了:
with t as (select 'T*76031*12558*test*received percents' as txt from dual)
select regexp_replace(txt, '.*(.{4})[*][^*].*$', '\1')
from t
我收到“测试” - 它是对的,但如何获得任意数量的字符,而不只是4?
答案 0 :(得分:2)
根据您使用的示例,这应该有效:
REGEXP_REPLACE( txt, '(^.*\*.*\*.*\*)([[:alnum:]]*)(\*.*$)', '\2')
所以SELECT将是:
WITH t
AS (SELECT 'T*76031*12558*test*received percents' AS txt FROM DUAL)
SELECT REGEXP_REPLACE( txt, '(^.*\*.*\*.*\*)([[:alnum:]]*)(\*.*$)', '\2')
FROM t;
正则表达式寻找:
第1组: 字符串的开头。任意数量的字符,直到''。任何其他字符mto另一个''。任何其他字符,直到第三个'*'。
第2组: 任何字母数字字符
第3组: 一个'*'后跟任何其他字符,直到字符串的末尾。
将上述所有内容替换为第2组中的所有内容。
希望这有帮助。
编辑: 继Rob van Wijk在另一个主题的回答之后:
Exracting substring from given string
WITH t
AS (SELECT 'T*76031*12558*test*received percents' AS txt FROM DUAL)
SELECT REGEXP_SUBSTR( txt,'[^\*]+',1,4)
FROM t;
答案 1 :(得分:2)
以下情况如何?
^([^*]*[*]){3}([^*]*)
第一部分匹配3组*,第二部分匹配所有内容,直到下一行*或行结束。
答案 2 :(得分:1)
您假设文本的最后一个*也是第四个。如果这个假设是真的那么:
\b\w*\b(?=\*[^*]*$)
会得到你想要的东西。但当然这只匹配最后一颗星之前的*之间的最后一个字。它只匹配此情况下的测试或*。
中的任何单词字符答案 3 :(得分:1)
注意: 10g REGEXP_SUBSTR不支持返回子表达式,请参阅下面的注释。
如果您真的只选择字符串的一部分,我建议使用REGEXP_SUBSTR。我不知道它是否更有效,但它会更好地记录你的意图:
SQL> select regexp_substr('T*76031*12558*test*received percents',
'^([^*]*[*]){3}([^*]*)', 1, 1, '', 2) from dual;
REGEXP_SUBST
------------
test
上面我使用了Pieter-Bas提供的regexp。