满意答案
由于极简化处理字符串复杂度现已经许 L i n u x 实用工具应用千万要则表达式 P e r l 、 P y t h o n 、 B a s h 等脚本语言专利作 C 语言程序员用户同自程序运用则表达式标准 C C + + 都支持则表达式些函数库辅助 C / C + + 程序员完功能其著名数 P h i l i p H a z e l P e r l - C o m p a t i b l e R e g u l a r E x p r e s s i o n 库许 L i n u x 发行版本都带函数库编译则表达式提高效率字符串与则表达式进行比较前首先要用 r e g c o m p ( ) 函数进行编译其转化 r e g e x _ t 结构: i n t r e g c o m p ( r e g e x _ t * p r e g , c o n s t c h a r * r e g e x , i n t c f l a g s ) ; 参数 r e g e x 字符串代表要编译则表达式;参数 p r e g 指向声明 r e g e x _ t 数据结构用保存编译结;参数 c f l a g s 决定则表达式该何处理细节函数 r e g c o m p ( ) 执行功并且编译结确填充 p r e g 函数返 0 任何其返结都代表某种错误产匹配则表达式旦用 r e g c o m p ( ) 函数功编译则表达式接调用 r e g e x e c ( ) 函数完模式匹配: i n t r e g e x e c ( c o n s t r e g e x _ t * p r e g , c o n s t c h a r * s t r i n g , s i z e _ t n m a t c h , r e g m a t c h _ t p m a t c h [ ] , i n t e f l a g s ) ; t y p e d e f s t r u c t { r e g o f f _ t r m _ s o ; r e g o f f _ t r m _ e o ; } r e g m a t c h _ t ; 参数 p r e g 指向编译则表达式参数 s t r i n g 要进行匹配字符串参数 n m a t c h p m a t c h 则用于匹配结返给调用程序参数 e f l a g s 决定匹配细节调用函数 r e g e x e c ( ) 进行模式匹配程能字符串 s t r i n g 处与给定则表达式相匹配参数 p m a t c h 用保存些匹配位置参数 n m a t c h 则告诉函数 r e g e x e c ( ) 少匹配结填充 p m a t c h 数组 r e g e x e c ( ) 函数功返 s t r i n g + p m a t c h [ 0 ] . r m _ s o s t r i n g + p m a t c h [ 0 ] . r m _ e o 第匹配字符串 s t r i n g + p m a t c h [ 1 ] . r m _ s o s t r i n g + p m a t c h [ 1 ] . r m _ e o 则第二匹配字符串依类推释放则表达式论候再需要已经编译则表达式都应该调用函数 r e g f r e e ( ) 其释放免产内存泄漏 v o i d r e g f r e e ( r e g e x _ t * p r e g ) ; 函数 r e g f r e e ( ) 返任何结仅接收指向 r e g e x _ t 数据类型指针前调用 r e g c o m p ( ) 函数所编译结程序针同 r e g e x _ t 结构调用 r e g c o m p ( ) 函数 P O S I X 标准并没规定否每都必须调用 r e g f r e e ( ) 函数进行释放建议每调用 r e g c o m p ( ) 函数则表达式进行编译都调用 r e g f r e e ( ) 函数尽早释放占用存储空间报告错误信息调用函数 r e g c o m p ( ) 或 r e g e x e c ( ) 非 0 返值则表明则表达式处理程现某种错误通调用函数 r e g e r r o r ( ) 详细错误信息 s i z e _ t r e g e r r o r ( i n t e r r c o d e , c o n s t r e g e x _ t * p r e g , c h a r * e r r b u f , s i z e _ t e r r b u f _ s i z e ) ; 参数 e r r c o d e 自函数 r e g c o m p ( ) 或 r e g e x e c ( ) 错误代码参数 p r e g 则由函数 r e g c o m p ( ) 编译结其目格式化消息所必须文提供给 r e g e r r o r ( ) 函数执行函数 r e g e r r o r ( ) 按照参数 e r r b u f _ s i z e 指明字节数 e r r b u f 缓冲区填入格式化错误信息同返错误信息度应用则表达式给具体实例介绍何 C 语言程序处理则表达式 # i n c l u d e < s t d i o . h > ; # i n c l u d e < s y s / t y p e s . h > ; # i n c l u d e < r e g e x . h > ; / * 取串函数 * / s t a t i c c h a r * s u b s t r ( c o n s t c h a r * s t r , u n s i g n e d s t a r t , u n s i g n e d e n d ) { u n s i g n e d n = e n d - s t a r t ; s t a t i c c h a r s t b u f [ 2 5 6 ] ; s t r n c p y ( s t b u f , s t r + s t a r t , n ) ; s t b u f [ n ] = 0 ; r e t u r n s t b u f ; } / * 主程序 * / i n t m a i n ( i n t a r g c , c h a r * * a r g v ) { c h a r * p a t t e r n ; i n t x , z , l n o = 0 , c f l a g s = 0 ; c h a r e b u f [ 1 2 8 ] , l b u f [ 2 5 6 ] ; r e g e x _ t r e g ; r e g m a t c h _ t p m [ 1 0 ] ; c o n s t s i z e _ t n m a t c h = 1 0 ; / * 编译则表达式 * / p a t t e r n = a r g v [ 1 ] ; z = r e g c o m p ( & r e g , p a t t e r n , c f l a g s ) ; i f ( z ! = 0 ) { r e g e r r o r ( z , & r e g , e b u f , s i z e o f ( e b u f ) ) ; f p r i n t f ( s t d e r r , " % s : p a t t e r n ' % s ' \ n " , e b u f , p a t t e r n ) ; r e t u r n 1 ; } / * 逐行处理输入数据 * / w h i l e ( f g e t s ( l b u f , s i z e o f ( l b u f ) , s t d i n ) ) { + + l n o ; i f ( ( z = s t r l e n ( l b u f ) ) > ; 0 & & l b u f [ z - 1 ] = = ' \ n ' ) l b u f [ z - 1 ] = 0 ; / * 每行应用则表达式进行匹配 * / z = r e g e x e c ( & r e g , l b u f , n m a t c h , p m , 0 ) ; i f ( z = = R E G _ N O M A T C H ) c o n t i n u e ; e l s e i f ( z ! = 0 ) { r e g e r r o r ( z , & r e g , e b u f , s i z e o f ( e b u f ) ) ; f p r i n t f ( s t d e r r , " % s : r e g c o m ( ' % s ' ) \ n " , e b u f , l b u f ) ; r e t u r n 2 ; } / * 输处理结 * / f o r ( x = 0 ; x < n m a t c h & & p m [ x ] . r m _ s o ! = - 1 ; + + x ) { i f ( ! x ) p r i n t f ( " % 0 4 d : % s \ n " , l n o , l b u f ) ; p r i n t f ( " $ % d = ' % s ' \ n " , x , s u b s t r ( l b u f , p m [ x ] . r m _ s o , p m [ x ] . r m _ e o ) ) ; } } / * 释放则表达式 * / r e g f r e e ( & r e g ) ; r e t u r n 0 ; } 述程序负责命令行获取则表达式其运用于标准输入每行数据并打印匹配结执行面命令编译并执行该程序: # g c c r e g e x p . c - o r e g e x p # . / r e g e x p ' r e g e x [ a - z ] * ' < r e g e x p . c 0 0 0 3 : # i n c l u d e < r e g e x . h > ; $ 0 = ' r e g e x ' 0 0 2 7 : r e g e x _ t r e g ; $ 0 = ' r e g e x ' 0 0 5 4 : z = r e g e x e c ( & r e g , l b u f , n m a t c h , p m , 0 ) ; $ 0 = ' r e g e x e c ' 结些需要进行复杂数据处理程序说则表达式疑非用工具本文重点于阐述何 C 语言利用则表达式简化字符串处理便数据处理面能够获与 P e r l 语言类似灵性
00分享举报