从BRE 与 ERE的文法看两者的异同
Posted ouyangbuxiu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从BRE 与 ERE的文法看两者的异同相关的知识,希望对你有一定的参考价值。
| |
关于BRE 和ERE,下面是Open Group公布的文法定义: BRE and Bracket Expression Grammar %token ORD_CHAR QUOTED_CHAR DUP_COUNT %token BACKREF L_ANCHOR R_ANCHOR %token Back_open_paren Back_close_paren /* '/(' '/)' */ %token Back_open_brace Back_close_brace /* '/{' '/}' */ /* The following tokens are for the Bracket Expression grammar common to both REs and EREs. */ %token COLL_ELEM META_CHAR %token Open_equal Equal_close Open_dot Dot_close Open_colon Colon_close /* '[=' '=]' '[.' '.]' '[:' ':]' */ %token class_name /* class_name is a keyword to the LC_CTYPE locale category */ /* (representing a character class) in the current locale */ /* and is only recognised between [: and :] */ %start basic_reg_exp %% /* -------------------------------------------- Basic Regular Expression -------------------------------------------- */ basic_reg_exp : RE_expression | L_ANCHOR | R_ANCHOR | L_ANCHOR R_ANCHOR | L_ANCHOR RE_expression | RE_expression R_ANCHOR | L_ANCHOR RE_expression R_ANCHOR ; RE_expression : simple_RE | RE_expression simple_RE ; simple_RE : nondupl_RE | nondupl_RE RE_dupl_symbol ; nondupl_RE : one_character_RE | Back_open_paren RE_expression Back_close_paren | Back_open_paren Back_close_paren | BACKREF ; one_character_RE : ORD_CHAR | QUOTED_CHAR | '.' | bracket_expression ; RE_dupl_symbol : '*' | Back_open_brace DUP_COUNT Back_close_brace | Back_open_brace DUP_COUNT ',' Back_close_brace | Back_open_brace DUP_COUNT ',' DUP_COUNT Back_close_brace ; /* -------------------------------------------- Bracket Expression ------------------------------------------- */ bracket_expression : '[' matching_list ']' | '[' nonmatching_list ']' ; matching_list : bracket_list ; nonmatching_list : '^' bracket_list ; bracket_list : follow_list | follow_list '-' ; follow_list : expression_term | follow_list expression_term ; expression_term : single_expression | range_expression ; single_expression : end_range | character_class | equivalence_class ; range_expression : start_range end_range | start_range '-' ; start_range : end_range '-' ; end_range : COLL_ELEM | collating_symbol ; collating_symbol : Open_dot COLL_ELEM Dot_close | Open_dot META_CHAR Dot_close ; equivalence_class : Open_equal COLL_ELEM Equal_close ; character_class : Open_colon class_name Colon_close ; /* -------------------------------------------- Extended Regular Expression -------------------------------------------- */ extended_reg_exp : ERE_branch | extended_reg_exp '|' ERE_branch ; ERE_branch : ERE_expression | ERE_branch ERE_expression ; ERE_expression : one_character_ERE | '^' | '$' | '(' extended_reg_exp ')' | ERE_expression ERE_dupl_symbol ; one_character_ERE : ORD_CHAR | QUOTED_CHAR | '.' | bracket_expression ; ERE_dupl_symbol : '*' | '+' | '?' | '{' DUP_COUNT '}' | '{' DUP_COUNT ',' '}' | '{' DUP_COUNT ',' DUP_COUNT '}' ; 可以看出BRE和ERE的几点区别: 1.特殊字符不同(也即意味着除去特殊字符剩下的普通字符也不完全相同) BRE: .[/ 句点, 左括号和反斜线除了用在括号表达式中, 应当是特殊的. 表达式包含 '[', 而'['前面不带反斜线且不是括号表达式一部分时, 产生未定义的结果. * 星号应当是特殊的, 除非当用于: A) 括号表达式 B) 整个BRE的第一个字符(如果有开头的'^', 在其后) C) 作为子表达式的第一个字符(如果有开头的'^', 在其后) ^ 抑扬符号当如下使用时应当是特殊的: A)定位符(anchor) B)括号表达式的第一个字符 $ 美元符号, 当用作定位符时是特殊的. ERE: .[/( 句点, 左括号, 反斜线, 和左圆括号当不用于括号表达式中时应当是特殊的. 在括号表达式外, 紧跟右圆括号的左圆括号产生未定义的结果. ) 无论在括号表达式内外, 当与前面的左圆括号匹配时, 右圆括号应当是特殊的. *+?{ 星号, 加号, 问号, 和左大括号当不用于括号表达式中时应当是特殊的. 下面的任何用法产生未定义结果: A) 如果这些字符出现在ERE的第一个, 或者紧跟竖线, 抑扬符, 或左 圆括号 B) 如果左大括号不是有效的间隔表达式的一部分 | 竖线符号应当是特殊的, 除非用于括号表达式中. 竖线符号出现在ERE的第一 个或最后, 或者紧跟竖线或左圆括号, 或在右圆括号前面, 将产生未定义的 结果. ^ 当用于下面情况时, 抑扬符应当是特殊的: A) 定位符 B) 括号表达式的第一个字符 $ 当用作定位符时, 美元符应当是特殊的. 2.BRE可以使用向后引用 3.字符重复匹配次数语法不同(BRE:/{m,n/} ;ERE:{m,n} ) 4.ERE可以使用组合()和交换| 但两者的括号表达式[]同样的 |
以上是关于从BRE 与 ERE的文法看两者的异同的主要内容,如果未能解决你的问题,请参考以下文章