oracle 正则表达式如何提取AABAAB类型的数据?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 正则表达式如何提取AABAAB类型的数据?相关的知识,希望对你有一定的参考价值。

oracle 正则表达式如何表达AABAAB型,另外regexp_like(servnumber,'((\d)\11(\d))1$'),没有结果显示。

用 regexp_like这个函数来解决,正则表达式为:[[:punct:]]+这个正则可以找出任何标点符号。
查询value中包含任何标点符号的记录如下:
select * from xxx where regexp_like(value,'[[:punct:]]+');

POSIX 正则表达式由标准的元字符(metacharacters)所构成: '$' 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。 '?' 匹配前面的子表达式零次或一次。 '*' 匹配前面的子表达式零次或多次。
'|' 指明两项之间的一个选择。例子'^([a-z]+|[0-9]+)$'表示所有小写字母或数字组合成的 '( )' 标记一个子表达式的开始和结束位置。 'm,n' 一个精确地出现次数范围,m=<出现次数<=n,'m'表示出现m次,'m,'表示至少出现m次。
\num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。 [[:alpha:]] 任何字母。
[[:digit:]] 任何数字。
[[:alnum:]] 任何字母和数字。
[[:space:]] 任何白字符。
[[:upper:]] 任何大写字母。
[[:lower:]] 任何小写字母。
[[:punct:]] 任何标点符号。
[[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F]。 \转义符 *, +, ?, n, n,, n,m 限定符^, $, anymetacharacter 位置和顺序。
参考技术A (((\w)\3)\w)\1追问

你这个三个连续数据是递增或者递减的。运行结果如下:
553012
553765
565567
666678
553345
553321
676678
010012
553123
11121123
522567

追答



如果都是数字就可以换成\\d,上面的多用了一个括号可以省略一个:

((\\d)\\2\\d)\\1

如果要求整个数据符合要求那么开头结尾加上\\b

\\b((\\d)\\2\\d)\\1\\b

Oracle 正则表达式的误解

【中文标题】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 正则表达式如何提取AABAAB类型的数据?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 使用带有 oracle regexp_substr 的正则表达式提取 json 字段

Jmeter之正则表达式提取获取数组类型数据

Oracle 正则表达式的误解

oracle 正则表达式

Oracle正则表达式

如何使用正则表达式提取骆驼大小写字符串的所有单词?