说到文本处理,无论你是使用sed,awk还是写一段什么语言的程序,最终的法宝总会是正则表达式。Boost默认使用Perl的正则表达式形式,个人觉得Perl的正则是最强大的。
正则表达式
- 定位类(不消耗文本) ^ 起始位置 $ 结束位置 < 单词起始 > 单词结束 \b 单词边界(包括起始和结束) \B 非单词边界 (?=pattern) 前面满足pattern (?!pattern) 前面不满足pattern (?<=pattern) 后面满足pattern (?<!pattern) 后面不满足pattern
- 分组类 (pattern) 分组,计算分组序号 (?<name>pattern) 分组,计算分组序号,并且可以用名字name来访问 (?:pattern) 分组,不计算分组序号 \N或\g{N} 代表与前面第N个分组的内容相同 \g{name} 代表与前面name分组的内容相同
- 字符类 . 单个任意字符 [字符列表] 列表中的字符 [^字符列表] 列表以外的字符 字符1|字符2 字符1或者字符2 \d或[[:digit:]] 数字 \w或[[:word:]] 字母 \s或[[:space:]] 空白 \l或[[:lower:]] 小写 \u或[[:upper:]] 大写 \D或[[:digit:]] 非数字 \W或[^[:word:]] 非字母 \S或[^[:space:]] 非空白 \L或[^[:lower:]] 非小字 \U或[^[:upper:]] 非大字
- 次数类 {m} 匹配m次 * 匹配0次或多次,尽可能多 + 匹配1次或多次,尽可能多 {m,n} 匹配m次到n次,尽可能多 {m,} 匹配m次或多次,尽可能多 上面4个的后面加上?的话(如+?),就变成尽可能少
- 输出类 $N或${N} 代表第N个分组的内容 $+{name} 代表name分组的内容 $&或$MATCH或${^MATCH} 代表整个匹配内容 $`或$PREMATCH或${^PREMATCH} 代表匹配内容之前的内容 $'或$POSTMATCH或${^POSTMATCH} 代表匹配内容之后的内容 \l 下一个字符小写 \u 下一个字符大写 \L 之后的输出小写,直到\E \U 之后的输出大写,直到\E \E 结束\L或\U
regex函数
- boost::regex_match bool boost::regex_match(str[,match_result],pat[,flag]); bool boost::regex_match(begin,end[,match_result],pat[,flag]); pat必须匹配字符串的全部 pat的申明方式:
- boost::regex pat(regex-str[,flag]);
- pat.assign(regex-str[,flag]); 注意:regex-str中的"/"要用"//",或者用C++11的新特性RawString(R"delim(...)delim")
- boost::regex_search bool boost::regex_search(str[,match_result],pat[,flag]); bool boost::regex_search(begin,end[,match_result],pat[,flag]); 与regex_match类似,只是pat可以只匹配字符串的一部分
- boost::regex_replace string boost::regex_replace(str,pat,out-format[,flag]);
- boost::regex_iterator boost::regex_iterator([begin,end,pat]); 对应的类型为boost::match_results boost::match_results的常用成员:
- size()
- prefix()
- suffix()
- [n]
- length(n)==[n].length()
- position(n)==[n].first
- boost::regex_token_iterator boost::regex_token_iterator([begin,end,pat,submatch]); 对应的类型为boost::sub_match(boost::match_results可以看作是boost::sub_match的数组) 当submatch>=0时,regex_token_iterator(begin,end,pat,submatch)==regex_iterator(begin,end,pat)[submatch] 当submatch==-1时,表示用pat作为分隔符来分割字符串 boost::sub_match的常用成员:
- length()
- str()
- first
- second