正则表达式中的运算符优先级



当 Oracle 的正则表达式不包含括号时,它们的默认运算符优先级是什么?

例如,给定

 H|ha+

它会像((H|h)a)那样被评估为H|h然后连接成a,还是像(H|(ha))那样将Hha交替?

另外,+什么时候开始等?

使用捕获组来演示计算顺序,正则表达式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文档:

运算符优先级 运算符的优先级顺序如下:

  1. 与排序规则相关的括号符号 [==] [::] [..]

  2. 转义字符 \

  3. 字符集(括号表达式)[]

  4. 分组 ()

  5. 单字符 ERE 重复 * + ?{m,n}

  6. 串联

  7. 锚定 ^$

  8. 交替 |

我会说H|ha+(?:H|ha+)一样.

最新更新