Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式中的运算符优先级_Regex_Oracle_Oracle11g_Operator Precedence - Fatal编程技术网

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

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匹配 再看一看: 运算符优先级 运算符的优先级顺序如下所示

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

例如,给定

 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标准中定义,但遗憾的是它们没有得到广泛支持。Java
    regex
    包实现了一个“类似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                       | |                    |
    +---+-----------------------------------+----------------------+