Regexp_substr查找不匹配一组字符的字符串

时间:2017-08-29 06:38:29

标签: oracle regexp-substr

我有一个像mystr = 'value1~|~value2~|~ ... valuen"这样的字符串。我需要它作为一行分隔在这样的行上:

value1
value2
...
valuen

我正在尝试这个

select regexp_substr(mystr, '[^(~\|~)]', 1 , lvl) from dual, (select level as lvl from dual connect by level <= 5);

问题在于~|~不被视为一个组,如果我将〜添加到字符串中的任何地方就会被分开; also()被视为分隔符。

非常感谢任何帮助!谢谢! 〜|〜

3 个答案:

答案 0 :(得分:0)

快速而肮脏的解决方案:

with t as (
select rtrim(regexp_substr('value1~|~value2~|~value3~|~value4', '(.+?)($|~\|~)', 1,level,''),'~|~')value  from dual connect by level<10
) select * from t where value is not null;

答案 1 :(得分:0)

[]表示单个字符匹配,[^]表示与任何包含的字符都不匹配的单个字符。

所以[^(~\|~)]会匹配任何一个不是(~\|~(再次)或)

您想要的是由分隔符终止的匹配项:

SELECT REGEXP_SUBSTR(
         mystr,
         '(.*?)(~\|~)',
         1,
         LEVEL,
         NULL,
         1
       )
FROM   DUAL
CONNECT BY LEVEL < REGEXP_COUNT( mystr, '(.*?)(~\|~)' );

(或者如果您不能进行零宽度匹配,则可以在'(.+?)(~\|~)'子句中使用正则表达式<=CONNECT BY。)

答案 2 :(得分:0)

这将解析分隔列表,正则表达式的格式将处理NULL列表元素,如示例所示。

private void button1_Click(object sender, EventArgs e)
{
    TimeSpan a = new TimeSpan(12, 00, 00);
    TimeSpan b = new TimeSpan(13, 00, 00);

    TimeSpan r = b - a;
    TimeSpan rr = new TimeSpan(r.Ticks / 2);

    MessageBox.Show("Test\n " + rr);   ///this is type TimeSpan 

    dateTimePicker.Value =Convert.ToDateTime(rr);   
    // error here
    // Additional Information: An object of type 'System.TimeSpan' 
    // can not be converted to type 'System.IConvertible'. "
}