Oracle正则表达式误解

时间:2014-02-20 04:37:34

标签: regex oracle plsql

我不明白如何从字符串末尾开始'第n次匹配模式'。我读过,但不能申请。

我正在使用的列是目录路径名,看起来通常如下:

I:\044\LOGFILE\aw_34\

我想拉出最后一个目录名,然后是第2个到最后一个。使用regexp_substr我可以使用

获取最后一个目录
SELECT REGEXP_SUBSTR(col_name, '\\[^\]+\\$')

我认为我在这里要求的是:'从col_name中的值结束开始,返回位于两个反斜杠之间的一个或多个非反斜杠字符的第一个实例。

但是,我无法使用任何合理的选项参数组合来获取第二个文件夹名称(在此示例中为'\ LOGFILE \')。我试过了:

SELECT REGEXP_SUBSTR(col_name, '\\[^\]+\\$', 1, 2)

返回NULL。看来我实际上并没有要求'从字符串末尾开始并找到第二次出现的模式'。所以,我采用了匹配最后两个文件夹的模式:

SELECT REGEXP_SUBSTR(col_name, '\\[^\]+\\[^\]+\\$')

然后,将此表达式包装在第二个正则表达式中,以便从前面的单个文件夹中获得匹配。

这有效,但无法帮助我理解使用

时的基本错误
REGEXP_SUBSTR(col_name, '\\[^\]+\\$', 1, 2)

或另一种更“直接”的方式来拉出我需要的匹配(在这个例子中是'\ LOGFILE \')。怎么了?

2 个答案:

答案 0 :(得分:3)

要匹配倒数第二个文件夹,请使用捕获组...

SELECT REGEXP_SUBSTR(col_name, '(\\[^\]+\\)[^\]+\\$', 1, 1, NULL, 1)

最后一个参数表示获取第一个捕获组,这是正则表达式模式中括号中的内容。

并且REGEXP_SUBSTR(col_name, '\\[^]+\\$', 1, 2)无效,因为$匹配字符串的结尾,因此不会有第二次匹配。

答案 1 :(得分:2)

您尝试的REGEXP_SUBSTR(col_name, '\\[^\]+\\$', 1, 2)无效,因为没有两个匹配以$字符串结尾结束 - 最多可以有一个此类匹配(任何其他匹配不是根据定义,在字符串的末尾。

我会尝试像

这样的东西
REGEXP_SUBSTR(col_name, '(\\[^\]+){2}\\$')

然后提取第一部分...注意这与你的情况略有不同。

或者,在Oracle的更高版本中(从版本11g开始),有一些方法可以使用捕获组 - REGEX_SUBSTR的第六个参数。例如,参见导致

https://stackoverflow.com/a/7759146/1967396
REGEXP_SUBSTR(col_name, '(\\[^\]+){2}\\$', 1, 1, NULL, 1)

给出“第一个捕获组的内容” - 这是“我的正则表达式括号内的东西” - 在你的例子中是\LOGIFLE(没有尾随\但是......属于“下一场比赛”)。