Oracle 正则表达式的误解
Posted
技术标签:
【中文标题】Oracle 正则表达式的误解【英文标题】:Oracle regexp Misunderstanding 【发布时间】:2014-02-20 04:37:34 【问题描述】:我不明白如何获得“从字符串末尾开始的第 n 个模式匹配”。我已阅读,但无法申请。
我正在使用的列是目录路径名,通常看起来像:
I:\044\LOGFILE\aw_34\
我想提取最后一个目录名,以及倒数第二个。使用 regexp_substr 我可以使用
获取最后一个目录SELECT REGEXP_SUBSTR(col_name, '\\[^\]+\\$')
我想我在这里要问的是:'从 col_name 中值的末尾开始,返回位于两个反斜杠之间的 1 个或多个非反斜杠字符的第一个实例。
但是,我无法使用任何合理的选项参数组合来仅获取第二个文件夹名称(在此示例中为“\LOGFILE\”)。我试过了:
SELECT REGEXP_SUBSTR(col_name, '\\[^\]+\\$', 1, 2)
返回 NULL。看来我实际上并不是在问“从字符串的末尾开始并找到模式的第二次出现”。所以,我已经求助于匹配最后两个文件夹的模式:
SELECT REGEXP_SUBSTR(col_name, '\\[^\]+\\[^\]+\\$')
然后,将此表达式包装在第二个正则表达式中,以获得从前面开始的单个文件夹的匹配项。
这行得通,但不能帮助我理解使用中的基本错误
REGEXP_SUBSTR(col_name, '\\[^\]+\\$', 1, 2)
或另一种更“直接”的方式来提取我需要的匹配项(在本例中为“\LOGFILE\”)。怎么了?
【问题讨论】:
+1 解释清楚的问题 【参考方案1】:要匹配倒数第二个文件夹,请使用捕获组...
SELECT REGEXP_SUBSTR(col_name, '(\\[^\]+\\)[^\]+\\$', 1, 1, NULL, 1)
最后一个参数表示获取第一个捕获组,即正则表达式模式中括号中的内容。
而REGEXP_SUBSTR(col_name, '\\[^]+\\$', 1, 2)
不起作用,因为$
匹配字符串的结尾,因此不会有第二次匹配。
【讨论】:
无论出于何种原因,我开始认为 '$' 的意思是“在字符串末尾开始搜索我的模式”,而不是“必须在字符串末尾”。我的正则表达式请求的废话应该是显而易见的。问题解决了。【参考方案2】:您尝试的 REGEXP_SUBSTR(col_name, '\\[^\]+\\$', 1, 2)
不起作用,因为没有两个匹配以 $
结尾的字符串 - 最多可以有一个这样的匹配(任何其他匹配都不在结尾字符串,根据定义)。
我会尝试类似的东西
REGEXP_SUBSTR(col_name, '(\\[^\]+)2\\$')
然后提取其中的第一部分...请注意,这与您所拥有的略有不同。
或者,在更高版本的 Oracle(从版本 11g 开始)中,有一些方法可以使用捕获组 - REGEX_SUBSTR
的第六个参数。参见例如https://***.com/a/7759146/1967396 导致
REGEXP_SUBSTR(col_name, '(\\[^\]+)2\\$', 1, 1, NULL, 1)
给出“第一个捕获组的内容” - 这是“我的正则表达式中括号中的内容” - 即您的示例中的\LOGIFLE
(虽然没有尾随\
......因为它属于“下一场比赛”)。
【讨论】:
以上是关于Oracle 正则表达式的误解的主要内容,如果未能解决你的问题,请参考以下文章