Matlab |
您所在的位置:网站首页 › matlab中strfind函数的用法 › Matlab |
关于正则表达式的基本知识
正则表达式就是一个表达式(也是一串字符),它定义了某种字符串模式。利用正则表达式,可以对大段的文字进行复杂的查找、替换等。 matlab提供的正则表达式函数有三个: regexp——用于对字符串进行查找,大小写敏感; regexpi——用于对字符串进行查找,大小写不敏感; regexprep——用于对字符串进行查找并替换。
第一部分——单个字符的匹配 1 句点符号 '.' ——匹配任意一个(只有一个)字符(包括空格)。 例如:t.n,它匹配tan、 ten、tin和ton,还匹配t#n、tpn甚至t n,还有其他许多无意义的组合。 Matlab例子程序: clear;clc str='ten,&8yn2tin6ui>&ton, t n,-356tpn,$$$$t#n,4@).,t@nT&nY'; pat='t.n'; [o11,o22,o33]=regexpi(str,pat,'start','end','match');%输出起始位置和子串 2 方括号符号 '[oum]' ——匹配方括号中的任意一个 例如:t[aeio]n只匹配tan,Ten,tin和toN等。 3 方括号中的连接符 '[c1-c2]' ——匹配从字符c1开始到字符c2结束的字母序列 4 \n 等 ——特殊字符 下面是一些匹配单个字符的转义字符正则表达式及所匹配的值。 \xN或\x{N} 匹配八进制数值为N的字符 \oN或\o{N} 匹配十六进制数值为N的字符 \a Alarm(beep) \b Backspace \t 水平Tab \n New line \v 垂直Tab \f 换页符 \r 回车符 \e Escape \c 某些在正则表达式中有语法功能或特殊意义的字符c,要用\c来匹配,而不能直接用c匹配,如.用正则表达式.匹配,而\用正则表达式\匹配 5 \w,\s和\d——类表达式 和上面的\n等表中的转义字符有所不同,\w,\s,\d等匹配的不是某个特定的字符,而是某一类字符。具体说明如下: \w匹配任意的单个文字字符,相当于[a-zA-Z0-9_]; \s匹配任意的单个空白字符,相当于[\t\f\n\r]; \d匹配任意单个数字,相当于[0-9]; \S匹配除空白符以外的任意单个字符,相当于[^\t\f\n\r]——方括号中的^表示取反; \W匹配任意单个字符,相当于[^a-zA-Z0-9_]; \D匹配除数字字符外的任意单个字符,相当于[^0-9]。 第二部分串的匹配 1.多次匹配{nstart,nend} 比如,我们要匹配'ppp',那么就可以用正则表达式'ppp',还可以记为'p{3}'。 正则表达式中的'{}'用来表示匹配前面的表达式的出现次数。就是说,'p{2,3}',匹配'pp'和'ppp'。例如: expr? 与expr匹配的元素出现0或1次,相当于{0,1} expr* 与expr匹配的元素出现1次或更多,相当于{0,} expr+ 与expr匹配的元素出现1次或更多,相当于{1,} expr{n} 与expr匹配的元素出现n次,相当于{n,n} expr{n,} 与expr匹配的元素至少出现n次 expr{n,m} 与expr匹配的元素出现n次但不多于m次 (1)假设匹配号码格式999-99-9999:[0-9]{3}-[0-9]{2}-[0-9]{4} (2)若连字符号可以出现也可以不出现:[0-9]{3}-?[0-9]{2}-?[0-9]{4} (3)使用expr*时,matlab将尽可能的匹配最长的字符子串。 (4)如果我们希望匹配尽可能短的字符子串时,可以在上面我们使用的字符串后使用'?',也就是expr*?,如: >> str='xyz'; regexp(str,'','match') ans = '' '' '' ''
regexp(str,'','match') ans = '' (5)expr*+ 先执行expr*,"游标"(如果有的话)就指到了与expr*匹配的字符子串的最末端,然后从那里开始再检查下一个字符与后面的表达式是否匹配,如果匹配就继续向前(如果一直成功则返回最长的字符串),如果不匹配则直接返回空。 2.逻辑运算符 'exp|exp2':或 (expr) 将expr标记为一组、匹配expr,并将匹配的字符子串标记起来以供后面使用。 (?:expr) 说明expr为一组,相当于数学表达式中的() 例如:?lstr='A body or collection of such stories'; ?regexp(lstr,'(?:[^aeiou][aeiou]){2,}','match') ans = 'tori' 上面的表达式中{2,}对[^aeiou][aeiou]起作用,如果去掉分组,则只对[aeiou]起作用,如下所示: ?regexp(lstr,'[^aeiou][aeiou]{2,}','match') ans = 'tio' 'rie' (?>expr) expr中的每个元素是一个分组 (?#expr) expr放在(?#和)之间是就是注释。 ^expr 匹配expr,并且出现在原字符串最前端的子串 expr$ 匹配expr,并且出现在原字符串最末端的子串 匹配expr,并且出现在一个单词最末端的子串 更严格的单词匹配,如:以s开头,并且以h结尾的单词 ?regexpi(hstr, '', 'match') ans = 'such' 3. 左顾右盼——利用上下文匹配 这个也比较容易理解。就是利用上下文的匹配来找到我们要找的内容。 expr1(?=expr2) 找到匹配expr1的子串,如果其后的字符串也匹配expr2 如,下面的例子查找所有在','之前的单词。 ? pstr = ['While I nodded, nearly napping, ' … 'suddenly there came a tapping,']; ?regexpi(pstr, '\w*(?=,)', 'match') ans = 'nodded' 'napping' 'tapping' expr1(?!expr2) 找到匹配expr1的子串如果其后的字符串不匹配expr2 下面的例子匹配所有不在','之前的单词 ?regexpi(pstr, '\w*+(?!,)', 'match') ans = Columns 1 through 6 'While' 'I' 'nearly' 'suddenly' 'there' 'came' Column 7 'a' (? 下面的例子查找所有不在','之后的单词, ?regexpi(pstr,'(? |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |