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

元字符 

描述

.点 

匹配任何单个字符。例如正则表达式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的正则表达式来实现一个递归定义,但是目前没找到很多有用的资料。找到一个例子的网址如下:
在自己的机器上写了把那段内容打出来,放到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'
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值