当Oracle的正则表达式不包含括号时,默认的运算符优先级是什么?
例如,给定
H|ha+
会将其评估为H|h
,然后与a
中的((H|h)a)
连接,还是H
与ha
交替,如同(H|(ha))
1}}?
此外,+
何时开始等等?
答案 0 :(得分:8)
鉴于Oracle doc:
表4-2列出了支持在传递给SQL正则表达式函数和条件的正则表达式中使用的元字符列表。这些元字符符合POSIX标准;行为与标准的任何差异都记录在"描述"列。
然后查看该表中的|
值:
表达式a | b匹配字符a或字符b。
再看看POSIX doc:
运营商优先权 运算符的优先顺序如下:
与整理相关的括号符号[==] [::] [..]
转义字符\
字符集(括号表达式)[]
分组()
单字符ERE重复* +? {M,N}
级联
锚定^ $
- 醇>
轮换|
我会说H|ha+
与(?:H|ha+)
相同。
答案 1 :(得分:3)
使用捕获组来演示评估顺序,正则表达式H|ha+
等同于以下内容:
(H|(h(a+)))
这是因为优先级规则(如下所示)按照从最高优先级(最低编号)到最低优先级(编号最高)之一的顺序应用:
规则5→(a+)
+
与a
分组,因为此运算符适用于前面的单个字符,后引用,组(“标记为子”表达式“在Oracle用语中”或括号表达式(字符类)。
规则6→(h(a+))
然后h
与上一步中的组连接。
规则8→(H|(h(a+)))
H
然后在上一步中与该组交替。
9.4.8 of the POSIX docs for regular expressions部分的优先级表(似乎没有正式的Oracle表):
+---+----------------------------------------------------------+
| | 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 | | |
+---+-----------------------------------+----------------------+
上表适用于扩展正则表达式。对于基本正则表达式,请参阅9.3.7。