Regex in Perl //默认的Boost::Regex 语法
在Perl正则表达式中,除了下面的特殊字符外,所有的字符都匹配自己:
.[{()\*+?|^$
1. Wildcard 通配符
单字符'.'在字符集之外使用时可以匹配任意单字符,除了 NULL & newLine
2. Anchors 锚点
'^'字符会匹配行的起始。
'$'字符会匹配行的终止。
3. Repeats 重复
a) * 操作符会匹配前面的原子零次或多次,例如表达式 a*b 可以匹配下面的:
b
ab
aaaaaaaab
b) + 操作符会匹配前面的原子一次或多次, 例如表达式 a+b 可以匹配下面的:
ab
aaaaaaaab
但不会匹配:
b
c) 原子同样可以被重复有界次数:
a{n} 匹配'a'重复n次。
a{n,} 匹配'a'重复n次或更多次。
a{n, m} 匹配'a'重复n次到m次之间。
4. Non greedy repeats 非贪婪重复
通常的重复是"贪婪的",也说明说它们会消耗尽可能多的输入。同样存在非贪婪版本,生成匹配时会消耗尽可能少的输入。
*? 匹配前面的原子零次或多次,但尽可能少地消耗输入。
+? 匹配前面的原子一次或多次,但尽可能少地消耗输入。
?? 匹配前面的原子零次或一次,但尽可能少地消耗输入。
{n,}? 匹配前面的原子n次或更多次,但尽可能少地消耗输入。
{n,m}? 匹配前面的原子n次到m次,但尽可能少地消耗输入。
5. Pocessive repeats
缺省情况下,当一个重复模式不能被匹配时,引擎将回溯直至找到一个匹配。但是,有时候这种行为不是用户所期望的, 因此还有一种"pocessive"重复:它尽可能多地进行匹配且当剩下的表达式不能匹配时不允许进行回溯。
*+ Matches the previous atom zero or more times, while giving nothing back.
*+ 匹配前一个原子零次或多次,但不退回。
++ Matches the previous atom one or more times, while giving nothing back.
++ 匹配前一个原子一次或多次,但不退回。
?+ Matches the previous atom zero or one times, while giving nothing back.
?+ 匹配前一个原子零次或一次,但不退回。
{n,}+ Matches the previous atom n or more times, while giving nothing back.
{n,}+ 匹配前一个原子n次或多次,但不退回。
{n,m}+ Matches the previous atom between n and m times, while giving nothing back.
{n,m}+ 匹配前一个原子n至m次,但不退回。
6. Back references 后向引用
一个转义字符跟着一个数字 n/,/n 的范围是1-9,匹配被子表达式 n 匹配的相同字符串。例如表达式:
^(a*).*\1$
匹配字符串: aaabbaaa
但不匹配: aaabba
你也可以用 \g 转义符达到相同功效,例如:
\g1
匹配子表达式1的内容
\g{1}
匹配子表达式1的内容:该方式可以在以下情形时更安全地对表达式进行分析:如 \g{1}2 或大于9的索引如 \g{1234}
\g-1
匹配最后一个被打开的子表达式的内容
\g{-2}
匹配倒数第二个被打开的子表达式的内容
\g{one}
匹配名为"one"的子表达式的内容
7. Alternation 选择
| 操作符匹配它的参数之一, 例如:abc|def 会匹配 "abc" 或 "def"。
括号可以用来对选择进行分组,例如:ab(d|ef) 会匹配 "abd" 或 "abef"。
8. Character sets 字符集
字符集是一个以 [ 开始,以 ] 结束的方括号表达式,它定义了一个字符的集合,匹配集合中的任意单个字符。
例如 [abc] 可以匹配 'a'、'b' 或 'c'。
例如 [a-c] 可以匹配'a'到'c'范围内的任意单个字符。
如果方括号表达式以 ^ 字符开始,那么它匹配包含字符的补集,例如 [^a-c] 匹配不在 a-c 范围内的任意字符。
形如 [[:name:]] 的表达式匹配命名字符类"name",例如 [[:lower:]] 任意小写字符。 参见 字符类名称。
---------------------------------------------
alnum
Any alpha-numeric character.
任意单词-数字字符。
alpha
Any alphabetic character.
任意单词字符。
blank
Any whitespace character that is not a line separator.
非行分隔符的任意空白字符。
cntrl
Any control character.
任意控制字符。
d
Any decimal digit
任意数字字符。
digit
Any decimal digit.
任意数字字符。
graph
Any graphical character.
任意图形字符。
l
Any lower case character.
任意小写字符。
lower
Any lower case character.
任意小写字符
print
Any printable character.
任意可打印字符。
punct
Any punctuation character.
任意标点字符。
s
Any whitespace character.
任意空白字符。
space
Any whitespace character.
任意空白字符。
unicode
Any extended character whose code point is above 255 in value.
任意码点高于255的扩展字符。
u
Any upper case character.
任意大写字符。
upper
Any upper case character.
任意大写字符。
w
Any word character (alphanumeric characters plus the underscore).
任意单词字符(字母、数字和下划线)。
word
Any word character (alphanumeric characters plus the underscore).
任意单词字符(字母、数字和下划线)。
xdigit
Any hexadecimal digit character.
任意十六进制数字字符。
---------------------------------------------
9. Escapes 转义符
\cX 一个ASCII转义序列 - 字符码点为 X % 32
\xdd 一个十六进制转义序列 - 匹配码点为0xdd的单个字符。
\x{dddd} 一个十六进制转义序列 - 匹配码点为0xdddd的单个字符。
\0ddd八进制转义序列 - 匹配码点为0ddd的单个字符。
\N{name} 匹配 符号名 为 name 的单个字符。例如 \N{newline} 匹配单个字符 \n。
\d[[:digit:]]
\l[[:lower:]]
\s[[:space:]]
\u[[:upper:]]
\w[[:word:]]
\hHorizontal
\vVertical
\D[^[:digit:]]
\L[^[:lower:]]
\S[^[:space:]]
\U[^[:upper:]]
\W[^[:word:]]
\H非水平空白
\V非垂直空白
10. Word Boundaries 单词边界
\< 匹配单词的起点。
\> 匹配单词的终点。
\b 匹配单词的边界(起点或终点)。
\B 只有不在单词边界时才匹配。
转义序列 \R 匹配任何行末符序列,特别地,它等同于表达式 (?>\x0D\x0A?|[\x0A-\x0C\x85\x{2028}\x{2029}]).
================================================================
typedef basic_regex<char> regex;
typedef match_results<const char*> cmatch;
typedef match_results<std::string::const_iterator> smatch;
================================================================
#regex_search#
string str("ajhdjfhih563uuu99-0ppp ");
boost::regex reg("(.*?)(\\d{2})", boost::regex::icase);
boost::smatch what;
string::const_iterator m = str.begin();
string::const_iterator n = str.end();
while(boost::regex_search(m, n, what, reg))
{
cout << what[0] << endl;
m = what[0].second;
}
================================================================
#regex_replace#
用正则表达式来进行字符替换。使用上和search差不多,不过多了个替换模式。
boost::regex reg("(Colo)(u)(r)",
boost::regex::icase|boost::regex::perl); //icase代表忽略大小写,perl应该是默认的参数,设置自己的参数要记得或上原先的参数
std::string s="Colour, colours, color, colourize";
s=boost::regex_replace(s,reg,"$1$3"); //$2被去掉。也就是要删除u。
std::cout << s; //输出:Colour, colors, color, colorize