Matlab正则表达式(递归、匹配上下文等)(转载)

来源:互联网 发布:dreamweaver有mac版吗 编辑:程序博客网 时间:2024/06/08 11:29

元字符 

描述

.点 

匹配任何单个字符。例如正则表达式r.t匹配这些字符串:rat、rut、r t,但是不匹配root。 

$

匹配行结束符。例如正则表达式weasel$ 能够匹配字符串"He's weasel"的末尾 

  但是不能匹配字符串"They are bunch of weasels."

^

匹配一行的开始。例如正则表达式^When in能够匹配字符串"When in the course of human events"的开始,但是不能匹配"What and When in the"

*

匹配0或多个正好在它之前的那个字符。例如正则表达式.*意味着能够匹配任意数量的任何字符。

这是引用符,用来将这里列出的这些元字符当作普通的字符来进行匹配。例如正则表达式\$被用来匹配美元符号,而不是行尾,类似的,正则表达式\.用来匹配点字符,而不是任何字符的通配符。

  [c1-c2] 

  [^c1-c2]

匹配括号中的任何一个字符。例如正则表达式r[aou]t匹配rat、rot和rut,但是不匹配ret。可以在括号中使用连字符-来指定字符的区间,例如正则表达式[0-9]可以匹配任何数字字符;还可以制定多个区间,例如正则表达式[A-Za-z]可以匹配任何大小写字母。另一个重要的用法是“排除”,要想匹配除了指定区间之外的字符——也就是所谓的补集——在左边的括号和第一个字符之间使用^字符,例如正则表达式[^269A-Z] 将匹配除了2、6、9和所有大写字母之外的任何字符。

\< \>

匹配词(word)的开始(\<)和结束(\>)。例如正则表达式\<the\>能够匹配字符串"for the wise"中的"the",但是不能匹配字符串"otherwise"中的"the"。注意:这个元字符不是所有的软件都支持的。

\( \)

将 \( 和 \) 之间的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个),它们可以用 \1 到\9 的符号来引用。

|

将两个匹配条件进行逻辑“或”(Or)运算。例如正则表达式(him|her) 匹配"it belongs to him"和"it belongs to her",但是不能匹配"it belongs to them."。注意:这个元字符不是所有的软件都支持的。

+

匹配1或多个正好在它之前的那个字符。例如正则表达式9+匹配9、99、999等。注意:这个元字符不是所有的软件都支持的。

?

匹配0或1个正好在它之前的那个字符。注意:这个元字符不是所有的软件都支持的。

\{i\} 

  \{i,j\}

匹配指定数目的字符,这些字符是在它之前的表达式定义的。例如正则表达式A[0-9]\{3\} 能够匹配字符"A"后面跟着正好3个数字字符的串,例如A123、A348等,但是不匹配A1234。而正则表达式[0-9]\{4,6\} 匹配连续的任意4个、5个或者6个数字字符。注意:这个元字符不是所有的软件都支持的。

============================================================================================

说明:为了看得更清楚,发在这里的匹配字符串的各个部分都用空格隔开了一下,在代码里,应该是不能用空格格开的。

一 关于圆括号的含义:

1 圆括号在匹配字符串中,并未作为普通字符进行匹配,见下例:
instr='(a+b)';
instr=regexprep(instr, '( \w \+ \w)', 'good');
disp(instr);
运行结果为:(good)。如果圆括号作为普通字符被匹配,则good外面应该没有括号。

2 对圆括号进行转义,即可把圆括号当做普通字符进行匹配,见下例:
instr='(a+b)';
instr=regexprep(instr, '\( \w \+ \w \)', 'good');
disp(instr);
运行结果为:good。例1与例2的区别仅在于匹配字符串的细微不同。

3圆括号用来标记token的用法,用$加数字来引用一个token时,引用的token不包括匹配字符串中标记该token的圆括号,见下例:
instr='(a+b)';
instr=regexprep(instr, '\( (\w) \+ \w \)', '$1');
disp(instr);
运行结果:a。例3与例2的区别仅在于例3的匹配字符串中,对第一个匹配的字符左右两边加了两个圆括号。

4 小结:事实证明,左右圆括号在匹配字符串中确实默认为特殊字符,如果要匹配圆括号,需要进行转义。

二 迭代匹配
1 迭代匹配字符串的例子如下:
instr='((-8)^(1/3))^(0.2)';
pat='\(([- | / | \d | \. | (^\^ | (\^ &\(abs)) | /abs]*)\)\^\((.*)\)';
repstr='$1+$2';

while(true)
   newstr=regexprep(char(instr), pat, repstr);
   disp('***');
   disp(newstr);
   disp('***');
   if(strcmp(newstr, instr)==1)
       break;
   else
       instr=newstr;
   end
end
disp(eval_r(newstr));
运行结果为:
***
(-8)^(1/3)+0.2
***
***
-8+1/3+0.2
***
***
-8+1/3+0.2
***
   -7.4667
这个结果是满足要求的。
===========================================================================================
需要用MATLAB的正则表达式来实现一个递归定义,但是目前没找到很多有用的资料。找到一个例子的网址如下:
http://www.360doc.com/content/06/0220/12/73_69675.shtml
在自己的机器上写了把那段内容打出来,放到MATLAB中运行,代码如下:
str='before(nope(yes(here)okay))after';
pat='\((?>[^()]+|\((?)|\)(?<-DEPTH>))*(?(DEPTH)(?!))\)';
ret_val=regexp(str, pat, 'match')
运行结果为:
ret_val = 
   '(here)'

=========================================================================================
MATLAB中的正则表达式支持利用上下文匹配来找到要找到的内容。

1 expr1(?=expr2):找到匹配expr1的子串,如果其后的字符串也匹配expr2。
2 expr1(?!expr2):找到匹配expr1的子串,如果其后的字符串不匹配expr2。
3(?<=expr1)expr2:找到匹配expr2的子串,如果其前面的字符串也匹配expr1。
4 (?<!expr1)expr2:找到匹配expr2的子串,如果其前面的字符串不匹配expr1。

代码示例如下:
% 待匹配字符串
pstr = ['While I nodded, nearly napping, ' ...
     'suddenly there came a tapping,'];
% 示例1
regexpi(pstr, '\w*(?=,)', 'match')
% 示例2
regexpi(pstr, '\w*(?!=,)', 'match')
% 示例3
regexpi(pstr,'(?<=,\s*)\w*','match')
% 示例4
regexpi(pstr,'(?<!,\s*)\w*','match')
运行结果如下:
ans = 
   'nodded'   'napping'   'tapping'
ans = 
  Columns 1 through 7
    'While'   'I'   'nodded'   'nearly'   'napping'   'suddenly'   'there'
  Columns 8 through 10
    'came'   'a'   'tapping'
ans = 
   'nearly'   'suddenly'
ans = 
  Columns 1 through 7
    'While'   'I'   'nodded'   'early'   'napping'   'uddenly'   'there'
  Columns 8 through 10
    'came'   'a'   'tapping'
 
源地址:http://wsummer114.blog.163.com/blog/static/12071907220113129432170/
0 0
原创粉丝点击