当 Oracle 的正则表达式不包含括号时,它们的默认运算符优先级是什么?
例如,给定
H|ha+
它会像((H|h)a)
那样被评估为H|h
然后连接成a
,还是像(H|(ha))
那样将H
与ha
交替?
另外,+
什么时候开始等?
使用捕获组来演示计算顺序,正则表达式H|ha+
等效于以下内容:
(H|(h(a+)))
这是因为优先级规则(如下所示)按从最高优先级(编号最低)到最低优先级(编号最高)的顺序应用:
规则 5 →
(a+)
+
与a
分组,因为此运算符处理前面的单个字符、反向引用、组(Oracle 用语中的"标记子表达式")或括号表达式(字符类)。规则 6 →
(h(a+))
然后,h
与上一步中的组连接。规则 8 →
(H|(h(a+)))
然后,H
与上一步中的组交替使用。
POSIX 文档第 9.4.8 节中正则表达式的优先级表(似乎没有官方的 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。
给定 Oracle 文档:
表 4-2 列出了支持在传递给 SQL 正则表达式函数和条件的正则表达式中使用的元字符列表。这些元字符符合 POSIX 标准;与标准的任何行为差异都在"说明"列中注明。
看看该表中的|
值:
表达式 a|b 匹配字符 a 或字符 b。
另外看看POSIX文档:
运算符优先级 运算符的优先级顺序如下:
与排序规则相关的括号符号 [==] [::] [..]
转义字符 \
字符集(括号表达式)[]
分组 ()
单字符 ERE 重复 * + ?{m,n}
串联
锚定 ^$
交替 |
我会说H|ha+
和(?:H|ha+)
一样.