kenlistian

厚积薄发. 勤为桨,思为帆

   :: 首页 :: 新随笔 ::  :: 聚合  :: 管理 ::
  73 随笔 :: 4 文章 :: 22 评论 :: 0 Trackbacks

1.正则表达式笔记

必须记住的几个符号和组合
.        匹配除换行符以外的所有字符一次
?        匹配 0 次或一次
*        匹配 0 次或多次
+        匹配 1 次或多次

               使用范例:

                x?        匹配 0 次或一次 x 字符串
                x*        匹配 0 次或多次 x 字符串,但匹配可能的最少次数,*必须跟随一个字符后面,不能单独出现
                x+        匹配 1 次或多次 x 字符串,但匹配可能的最少次数,+必须跟随一个字符后面,不能单独出现
                .*        匹配 0 次或一次的任何字符
                .+        匹配 1 次或多次的任何字符

界定范围和位置
^        匹配字符开头的字符
$         匹配字符结尾的字符
{m}          匹配刚好是 m 个 的指定字符串
{m,n}        匹配在 m个 以上 n个 以下 的指定字符串
{m,}          匹配 m个 以上 的指定字符串
[]           匹配符合 [] 内的字符
[^]         匹配不符合 [] 内的字符
[0-9]         匹配所有数字字符
[a-z]        匹配所有小写字母字符
[^0-9]        匹配所有非数字字符
[^a-z]        匹配所有非小写字母字符

\b         匹配以英文字母,数字为边界的字符串
\d         匹配一个数字的字符,和 [0-9] 语法一样
\w        英文字母或数字的字符串,和 [a-zA-Z0-9] 语法一样
\s         空格,和 [\n\t\r\f] 语法一样
\B         匹配不以英文字母,数值为边界的字符串
\D         非数字,其他同 \d
\S         非空格,和 [^\n\t\r\f] 语法一样
\W        非英文字母或数字的字符串,和 [^a-zA-Z0-9] 语法一样

a|b|c       匹配符合a字符 或是b字符 或是c字符 的字符串
abc         匹配含有 abc 的字符串
转义:      使用\ 来取消元字符的特殊意义。包括 . * + \  [ ] { } ( ) ^ $


?的多重定义-懒惰限定符
*?    重复任意次,但尽可能少重复
+?    重复1次或更多次,但尽可能少重复
??    重复0次或1次,但尽可能少重复
{n,m}?    重复n到m次,但尽可能少重复
{n,}?    重复n次以上,但尽可能少重复


断言匹配: 有4个

(?=exp)   零宽先行断言,它匹配文本中的某些位置,这些位置的后面能匹配给定的后缀exp。
             比如/b/w+(?=ing/b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),
              zc:根据后缀匹配而已。和$区别在于$是行尾匹配。
              如I'm singing while you're dancing.  它会匹配sing和danc。

(?<=exp)  零宽后行断言,它匹配文本中的某些位置,这些位置的前面能给定的前缀匹配exp。
               如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),
               zc:匹配前缀。
                例如在查找reading a book时,它匹配ading。

(?!exp)    零宽负向先行断言。会匹配后缀exp不存在的位置。
              zc: 若不是exp或者没有则匹配,用^在于存在一个不匹配某个exp的其他字符,而!保证不匹配exp外可以不跟任何字符。
             
如:\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字。 也可以是只有前3位数字。比较\d{3}(^\d)有区别.

(?<!exp)   零宽负向后行断言。查找前缀exp不存在的位置.

条件匹配: (zc:这个复杂,但也不复杂。属于perl中的扩展部分,略)

Conditional Expressions

(?(condition)yes-pattern|no-pattern)
   attempts to match yes-pattern if the condition is true, otherwise attempts to match no-pattern.

(?(condition)yes-pattern) attempts to match yes-pattern if the condition is true, otherwise fails.

condition may be either a forward lookahead assert, or the index of a marked sub-expression
(the condition becomes true if the sub-expression has been matched).

 

 

2. boost中分有match,search,replace,在vc中,其正则表达式以上\表示需要双反斜杠表示。其中在

match是匹配整个句子,在实际应用中,必须是构造整个句子的正则表达,而在一篇文章匹配的话,以search用的

比较多,如下见一个片段。没有用到std,可见用boost在匹配查询时,其比较麻烦:

void test123()
{      
    CString str = "singing while youre dancing.";
    regex ee_all("\\b\\w+\\b");
    cmatch result;
    CString ret;
    while(regex_search(str, result, ee_all,match_perl)){           
        for(int i=0; i < result.size(); i++){           
            ret = result[i].str().c_str();
            AfxMessageBox(ret);               
            str = result[i].second;
        }           
    }   
}

posted on 2008-04-29 11:26 kenlistian 阅读(1210) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理