我不明白如何从字符串末尾开始'第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 \')。怎么了?
答案 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
的第六个参数。例如,参见导致
REGEXP_SUBSTR(col_name, '(\\[^\]+){2}\\$', 1, 1, NULL, 1)
给出“第一个捕获组的内容” - 这是“我的正则表达式括号内的东西” - 在你的例子中是\LOGIFLE
(没有尾随\
但是......属于“下一场比赛”)。