Regex 正则表达式中的运算符优先级
当Oracle正则表达式不包含括号时,默认的运算符优先级是多少 例如,给定Regex 正则表达式中的运算符优先级,regex,oracle,oracle11g,operator-precedence,Regex,Oracle,Oracle11g,Operator Precedence,当Oracle正则表达式不包含括号时,默认的运算符优先级是多少 例如,给定 H|ha+ 它将被评估为H | H,然后像((H | H)a)那样连接到a,还是像(H | H)ha)那样将H替换为ha 另外,+什么时候开始等?给定: 表4-2列出了在传递给SQL正则表达式函数和条件的正则表达式中支持使用的元字符列表。这些元字符符合POSIX标准;在“说明”栏中注明行为与标准的任何差异 并查看该表中的|值: 表达式a | b与字符a或字符b匹配 再看一看: 运算符优先级 运算符的优先级顺序如下所示
H|ha+
它将被评估为H | H
,然后像((H | H)a)
那样连接到a
,还是像(H | H)ha)那样将H
替换为ha
另外,+
什么时候开始等?给定:
表4-2列出了在传递给SQL正则表达式函数和条件的正则表达式中支持使用的元字符列表。这些元字符符合POSIX标准;在“说明”栏中注明行为与标准的任何差异
并查看该表中的|
值:
表达式a | b与字符a或字符b匹配
再看一看:
运算符优先级
运算符的优先级顺序如下所示:
与排序规则相关的括号符号[=][::][…]
转义字符\
字符集(括号表达式)[]
分组()
单字符重复*+?{m,n}
串联
锚定^$
交替|
我想说,H | ha+
与(?:H | ha+
使用捕获组来演示评估顺序,正则表达式H | ha+
等同于以下内容:
(H|(h(a+)))
这是因为优先级规则(如下所示)按从最高优先级(编号最低)到最低优先级(编号最高)的顺序应用:
- 规则5→
(a+)
将+
与a
分组,因为此运算符处理前面的单个字符、反向引用、组(Oracle术语中的“标记子表达式”)或括号表达式(字符类)
- 规则6→
(h(a+)
然后在上一步中将h
与组连接起来
- 规则8→
(H |(H(a+))
然后将H
与前面步骤中的组交替
第节中的优先级表(似乎没有正式的Oracle表):
+---+----------------------------------------------------------+
||优先级(从高到低)|
+---+----------------------------------------------------------+
|1 |排序相关括号符号|[=][::][…]|
|2 |转义字符||
|3 |括号表达式|[]|
|4 |分组|()|
|5 |单字符或重复|*+?{m,n}|
|6 |串联||
|7 |锚定| ^$|
|8 |交替| ||
+---+-----------------------------------+----------------------+
上表是针对扩展正则表达式的。有关基本正则表达式,请参见。?:in(?:…)不是Oracle语法。@mathguy我同意,但我想说明它与(H | ha+
不同,因为没有捕获组,如Thomas所示,交替(交替运算符)的优先级最低。使用H | ha+的regexp搜索将首先尝试使用H,并且只有当它找不到匹配项(在尝试了其他运算符指示的所有组合之后),作为最后手段,它才会使用ha+而不是H重试。+是一元运算符,它附加到一个only,贪婪性适用。关于优先级的有趣问题:如果有两个“替换”组,按什么顺序进行评估?回答-第一个替换中的第一个选项与第二个替换中的所有选项一起尝试,如果没有找到任何匹配项,则尝试第一个替换中的第二个选项。从dual中选择regexp_substr('adibcd','(a | b)(c | d);
返回'ad'(另一个选择是'bc',但在检查ac之后,regexp会在尝试bc之前检查ad)。@ThomasAyoub点运算符(“.”)的优先级是多少?与其他通配符运算符相同?我似乎在任何地方都找不到答案。Java正则表达式支持排序符号吗?@VictorGrazi排序符号在POSIX标准中定义,但遗憾的是它们没有得到广泛支持。Javaregex
包实现了一个“类似Perl”的正则表达式引擎,缺少一些功能(例如,条件表达式和注释),但包括一些额外的(例如,所有格量词和可变长度但有限的look-behind断言)。Perl和Java都不支持排序序列或字符等价。但是,Perl确实支持“适当的”“POSIX字符类,尽管Java仅支持使用\p运算符(有一些警告)。如果我们将其包含在ERE优先级表中,那么反向引用的位置在哪里?”?
+---+----------------------------------------------------------+
| | ERE Precedence (from high to low) |
+---+----------------------------------------------------------+
| 1 | Collation-related bracket symbols | [==] [::] [..] |
| 2 | Escaped characters | \<special character> |
| 3 | Bracket expression | [] |
| 4 | Grouping | () |
| 5 | Single-character-ERE duplication | * + ? {m,n} |
| 6 | Concatenation | |
| 7 | Anchoring | ^ $ |
| 8 | Alternation | | |
+---+-----------------------------------+----------------------+