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

时间:2016-04-26 16:03:29

标签: regex oracle oracle11g operator-precedence

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

例如,给定

 H|ha+

会将其评估为H|h,然后与a中的((H|h)a)连接,还是Hha交替,如同(H|(ha)) 1}}?

此外,+何时开始等等?

2 个答案:

答案 0 :(得分:8)

鉴于Oracle doc

  

表4-2列出了支持在传递给SQL正则表达式函数和条件的正则表达式中使用的元字符列表。这些元字符符合POSIX标准;行为与标准的任何差异都记录在"描述"列。

然后查看该表中的|值:

  

表达式a | b匹配字符a或字符b。

再看看POSIX doc

  

运营商优先权   运算符的优先顺序如下:

     
      
  1. 与整理相关的括号符号[==] [::] [..]

  2.   
  3. 转义字符\

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

  6.   
  7. 分组()

  8.   
  9. 单字符ERE重复* +? {M,N}

  10.   
  11. 级联

  12.   
  13. 锚定^ $

  14.   
  15. 轮换|

  16.   

我会说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