## boost regex语法规范

这部分包含了boost.regex库的正则表达式的语法。这是一份程序员指南，实际的语法由在程序中的正则表达式的选项决定。（译注：即regex类构造函数的flag参数。）

“.”, “|”, “*”, “?”, “+”, “(“, “)”, “{“, “}”, “[“, “]”, “^”, “$” 和 “\” 要使用这些字符的字面意义，要在前面使用 “\” 字符。一个字面意义的字符匹配其本身，或者匹配 traits_type::translate() 的结果，这里的traits_type 是 basic_regex 类的特性模板参数(the traits template parameter)。 通配符（Wildcard） 点号 ”.” 匹配任意的单个字符。当在匹配算法中使用了 match_not_dot_null 选项，那么点号不匹配空字符(null character)。当在匹配算法中使用了 match_not_dot_newline 选项，那么点号不匹配换行字符（newline character）。 重复（Repeats） 一个重复是一个表达式（译注：正则表达式）重复任意次数。一个表达式后接一个 “*” 表示重复任意次数（包括0次）。一个表达式后接一个 “+” 表示重复任意次数（但是至少1次）。如果表达式使用 regex_constants::bk_plus_qm编译（译注：regex类构造函数的flag参数），那么 “+” 是一个普通的字符（译注：即 “+” 表示其字面意义）， “\+” 用来表示重复一或多次。一个表达式后接一个 “?” 表示重复0或1次。如果表达式使用 regex_constants::bk_plus_qm 选项，那么 “?” 是一个普通字符，”\?” 用来表示重复0或1次。如果需要显式的指定重复的最大最小次数的话，请使用边界操作符 “{}”，那么 “a{2}” 表示字母 “a” 重复2次， “a{2,4}” 表示字母 “a” 重复2至4次， “a{2,}” 表示字母 “a” 重复至少2次（无上限）。注意：在{}之间是没有任何空格的，并且上下边界的大小是没有上限的。如果表达式使用 regex_constants::bk_braces 选项编译，那么 “{” 和 “}” 是普通字符， “\{” 和 “\}” 用来表示边界操作符。所有的重复表达式是最短的前置子串（the shortest possible previous sub-expression）：单个字符，字符集合，或者是用诸如 “()” 括起来的子表达式。 例： “ba*” 匹配 “b”, “ba”, “baaa” 等等。 “ba+” 匹配诸如 “ba”, “baaaa” 此类，而不匹配 “b”。 “ba?” 匹配 “b” 或 “ba”。 “ba{2,4}” 匹配 “baa”, “baaa” 和 “baaaa”。 非“贪心”重复（Non-greedy repeats） 无论是否启用“扩展(extended)”正则表达式语法（默认的），总是允许使用非贪心重复，只要在重复的后面加一个 “?” 。非贪心重复是匹配最短可能串(the shortest possible string)的重复。 例如要匹配html的一对标签，可以使用： “<\s*tagname[^>]*>(.*?)<\s*/tagname\s*>” 这里$1会包含标签之间的文本，这段文本是最短匹配的字符串。

“(?:abc)*”

“(?=abc)” 匹配0个字符，除非表达式以 “abc” 开头。

“(?!abc)” 匹配0个字符，除非表达式不以 “abc” 开头。

（译注：断言并不匹配，例如： “(?=abc)abcdef” 匹配 “abcdef” ，前面的 “(?=abc)” 并不匹配 “abc” ，而是查看是否已abc开头，如果需要匹配 “abc” 还是需要在后面写上的。）

“(?>expression)” 匹配 “expression” 作为一个独立的原子动作（除非产生错误，算法不会回退产看）。

“a(b|c)” 匹配 “ab” 或 “ac”。

“abc|def” 匹配 “abc” 或 “def”。

"[abc]" 匹配 "a", "b", 或 "c"。

"[^abc] 匹配除 "a", "b", 和 "c" 之外的任何字符。

"[a-z]" 匹配任意在 "a" 至 "z" 之间的字符。

"[^A-Z]" 匹配在 "A" 至 "Z" 之外的字符。

 alnum 任何字符数字 alpha a-z和A-Z之间的字母。如果设置了地域的话，可能包含其它字符。 blank 任何空白字符，空格或者tab字符。 cntrl 任何控制字符 digit 任何0-9之间的数字 graph 任何图形字符 lower a-z之间的小写字符。如果设置了地域的话，可能包含其它字符。 print 任何可打印字符 punct 任何标点符号 space 任何空格字符 upper A-Z之间的大写字母。如果设置了地域的话，可能包含其它字符。 xdigit 任何在0-9,a-f和A-F之间的16进制数字 word 任何单词字符 – 字母数字加上下划线 Unicode 任何编码大于255的字符，只能在宽字符中使用

\w 代替 [:word:]

\s代替 [:space:]

\d代替[:digit:]

\l代替[:lower:]

\u代替[:upper:]

Equivalence classes take the generalform[=tagname=] inside a set declaration, where tagname is either a single character, or a name of a collating element, and matches any character that is a member of the same primary equivalence class as the collating element [.tagname.]. An equivalence class is a set of characters that collate the same, a primary equivalence class is a set of characters whose primary sort key are all the same (for example strings are typically collated by character, then by accent, and then by case; the primary sort key then relates to the character, the secondary to the accentation, and the tertiary to the case). If there is no equivalence class corresponding to tagname ,then[=tagname=] is exactly the same as [.tagname.]. Unfortunately there is no locale independent method of obtaining the primary sort key for a character, except under Win32. For other operating systems the library will "guess" the primary sort key from the full sort key (obtained from strxfrm), so equivalence classes are probably best considered broken under any operating system other than Win32.

To include a literal "-" in a set declaration then: make it the first character after the opening "[" or "[^", the endpoint of a range, a collating element, or if the flag regex_constants::escape_in_lists is set then precede with an escape character as in "[\-]". To include a literal "[" or "]" or "^" in a set then make them the endpoint of a range, a collating element, or precede with an escape character if the flag regex_constants::escape_in_lists is set.

These differences between Perl matching rules, and POSIX matching rules, mean that these two regular expression syntaxes differ not only in the features offered, but also in the form that the state machine takes and/or the algorithms used to traverse the state machine.

posted on 2010-03-19 13:42  cy163  阅读(3015)  评论(0编辑  收藏