如何在oracle sql查询中使用regex表达式?

时间:2013-02-11 14:24:07

标签: regex oracle

在我的位置字段中,我有:

"Location:
SOME PLACE

Additional Details:
DEFECT
"

不知怎的,我需要这个来取出"SOME PLACE"。我试图理解regexp_substr()函数是如何工作的,但它与我的C#背景非常不同,我不断得到奇怪的结果,如null。

通常我会期望做类似的事情:

regexp_substr(LocationField, 'Location:(.*)\n') as "NewLocation"

并且它要删除括号中的部分...但我错了。有什么想法吗?

解决方案:

regexp_replace(FIELD, 'Location:'||CHR(13)||CHR(10)||'(.*).*$'||CHR(13)||CHR(10)||CHR(13)||CHR(10)||'Additional Details:.*$', '\1', 1, 1, 'n' ) as "Location"

3 个答案:

答案 0 :(得分:1)

你可以这样做:

regexp_replace(LocationField, 
               'location:'||chr(10)||'([^'||chr(10)||']*).*$', '\1', 
                1, 1, 'n' ) 

即正则表达式字符串

location:\n([^\n]*).*$

但是由于oracle不能与\n一起使用,我们会在chr(10)中进行拼接。

n模式意味着.将与换行符相匹配(因此.*$会删除在某些文字后面的换行符之后的所有内容。

如果位置可以有多行文本,后跟添加详细信息,则可以使用:

regexp_replace(LocationField, 
               'location:'||chr(10)||'(.*)'||chr(10)||'Additional.*$',  
               '\1', 1, 1, 'n' ) as "NewLocation"

答案 1 :(得分:0)

改为使用REGEXP_REPLACE

select REGEXP_REPLACE( target, LocationField, 'Location:(.*)\n', '' ) as "NewLocation"
from your_table;

应该让你朝着正确的方向前进。

答案 2 :(得分:0)

您需要以多行模式运行正则表达式,这意味着填充REGEXP_SUBSTR()调用的完整签名:

select regexp_substr( locationField, '^([A-Z ]+)$', 1, 1, 'm')
from your_table
/

'm'是指定多行模式的匹配参数。这意味着匹配模式中的^$被视为newline边界,而不是字符串的开头和结尾。 Find out more