19.3 字符串的匹配

19.3 字符串的匹配

19.3.1 多次匹配

例如需要匹配'ppp',可以用正则表达式'ppp',还有一种更简单的记法:'p{3}'。正则表达式中的'{}'用来表示匹配前面的表达式的出现次数,即'p{2,3}'匹配'pp'和'ppp'。除了'{}'外,还有几个字符,用在表示单个字符的正则表达式后面表示次数,如下:

假设要在文本文件中搜索美国的社会安全号码,该号码的格式是999-99-9999。用来匹配它的正则表达式为[0-9]{3}\-[0-9] {2}\-[0-9]{4}。在正则表达式中,连字符("-")有着特殊的意义,因此,它的前面要加上一个转义字符\。

如果希望连字符号可以出现,也可以不出现,即999-99-9999 和999999999 都属于正确的格式,则可以在连字符号后面加上'?'数量限定符,这样正则表达式为[0-9]{3}\-?[0-9]{2}\-?[0-9]{4}。另外,在使用expr*时,MATLAB将尽可能地匹配最长的字符子串。例如:

如果希望匹配尽可能短的字符子串,则可以在使用的字符串后使用'?',也就是expr*?。例如:

这个表达式的执行过程是这样的:先执行expr*,"游标"(如果有的话)就指到了与expr*匹配的字符子串的最末端,然后从那里开始再检查下一个字符与后面的表达式是否匹配,如果匹配就继续向前(如果一直成功则返回最长的字符串),如果不匹配则直接返回空。例如:

19.3.2 逻辑运算符

explexp2:表示或者满足exp或者满足以exp2。

(expr)将expr标记为一组,匹配expr,并将匹配的字符子串标记起来以供后面使用(关于这部分内容,下面还会有更详细的介绍)。

(?:expr):表示expr为一组,相当于数学表达式中的()。

例如:

在上面的表达式中,{2,}对[^aeiou][aeiou]起作用:如果去掉分组,则只对[aeiou]起作用,如下:

(?>expr)expr 中的每个元素是一个分组。(?#expr)放在(?#和)之间的是注释。例如:

exprl ∣expr2:匹配exprl或者expr2二者之一即可。

^expr:匹配expr,并且出现在原字符串最前端的子串。expr$匹配expr,并且出现在原字符串最末端的子串。

\<expr:匹配expr,并且出现在一个单词最前端的子串。

expr\>:匹配expr, 并且出现在一个单词最末端的子串。

\<expr\>:更严格的单词匹配,如以s开头,并以h结尾的单词。

19.3.3 左顾右盼一一利用上下文匹配

利用上下文的匹配来找到我们要找的内容。

expr1(?=expr2):找到匹配expr1的子串(如果其后的字符串也匹配expr2)。下面的例子查找所有在','之前的单词:

expr1(?,expr2):找到匹配expr1的子串(如果其后的字符串不匹配expr2)。下面的例子查找所有不在','之前的单词:

(?<=expr1)expr2:找到匹配expr2的子串(如果其前面的字符串也匹配expr1)。下面的例子查找所有在','之后的单词,注意','之后可能有空格:

(?<!expr1)expr2:找到匹配expr2的子串(如果其后的字符串不匹配expr1)。下面的例子查找所有不在','之后的单词: