我有一个像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()被视为分隔符。
非常感谢任何帮助!谢谢! 〜|〜
答案 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'. "
}