正则表达式详解<一>

正则表达式是一种处理字符串的微型语言;有以下的基本术语:

l  模式(pattern):正则表达式实际上是通过字符串表达的一个模式

l  匹配(match): 判断正则表达式和给出的序列[first , last),是否全部匹配

l  搜索(search):判断在给定的序列里是否存在和正则表达式匹配的子字符串

l  替换(replace):将匹配到的子字符串替换成其他的字符串

在C++里边默认的语法是ECMAScript,这是最强大的正则表达式的语法;

1.  ECMAScript语法

1.   锚点(anchor)

特殊字符^和$是锚点,分别匹配到字符串的开头和结尾。例如:^text$,表达的意思就是只匹配text字符串

     2.通配符(wildcard)

     可以用来匹配除了换行符以外的任何字符,例如:正则表达式是:a.b,可以匹配到abc,adb,

但是不可是:acdb

3.替换

A|B 可以匹配到A或则是B

4.分组(捕获组)

例如:(.)(ab|cd)(.)其中有三个标记的子表达式,例如输入1ab5则可以捕获到,1 。 ab。5这仨个捕获组。

     5.重复

     * 表示匹配零次或则多次之前的部分。例如:a*b 可以匹配到b , ab , aab , aaab

     + 表示匹配一次以及一次以上之前的部分,例如:a+b可以匹配到ab , aab但是不能是b

     ? 表示匹配到零次或是一次以前的部分,例如: a ? b 可以匹配到ab , b 但是不能位 aab

     {…}表示区间重复,a{n}表示匹配到的a刚好位n个,a{n,}表示匹配到的a为n位或则n位以上;a{n,m}表示匹配到的a的个数位>=n和<=m个;

     6.贪婪匹配和非贪婪匹配

     输入字符串位: aaabbb

     贪婪匹配:正则表达式:(a+)(ab)*(b+) ,匹配到:”aaa””””bbb”

     非贪婪匹配:正则表达式:(a+?)(ab)*(b+)匹配到:“aa“”ab””bb”;

     7.优先级

     第一:元素本身

     第二:量词:+,* , ? {…}

     第三:串联:例如ab+c在量词之后绑定

     第四:替代符| ,最后绑定

     例如:正则表达式:ab+c|d,会匹配到abc, abbc , d , 如果添加括号,ab+(c|d)则匹配到

     , abc , abbc , abd abbd

     8,字符集合匹配

     [a-z]表示可以匹配到a到z之间的任意一个字符,(注意是任意一个,而不是多个)

     [a-zA-Z]表示可以匹配到a到z以及A到Z之间对的任意一个字符;

     另一种方法是使用某种字符类,表示方法[:name:]例如:

     [[:digit:]]表示可以匹配到0~9之间的任意一个数字;

     这里的name可以是以下:

    

Name

Expression

digit

数字

d

和digit一样

xdigit

数字和表示16进制的abcdef或则ABCDEF

alpha

字母字符所有的大小写

alnum

Alpha和digit的组合

w

和alnum一样

lower

小写字母

upper

大写字母

blank

一行文本中分割单词的空格符

punct

标点符号字符,包括不是alnum意外的所有图形字符

应用:

问题:表示0~9的任意一个以及多个数字的匹配

解答:(1)[0-9]+

          (2)  [[:digit:]]+

          (3)  [[:d:]]+

          (4)  d+

问题:匹配除了小写字母以外的任意字符

解答:(1) [[:upper:]]

         (2) [^[:lower:]]

     9.后向引用

       n是>0的整数,表示第n个捕捉组,例如:

     正则表达式:([:d:]*)-.*-1

     可以匹配到:123-abc-123 , 789-kdf-789 , 9-m-9

     但是不可是:123-abc-1234,必须是123,和第一个捕获组一样的内容;

     10.C++里的转义   

     转移d,在C++里应该将其转移,因为是特殊字符在C++里,所以需要转移,转义位:

     \d.

     转移\,这个更加麻烦。应该转译为:\\

     例如:
     正则表达式:( |\n|\r|\\)

     搜索空格 , 换行符 , 回车符 , 反斜杠;

原文地址:https://www.cnblogs.com/boost/p/10425492.html