matlab提供的正則表達式函數(shù)有三個:
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');
% 輸出起始位置o11和子串o33(具體找出來的匹配字符的cell array)
2 方括號符號 '[oum]' ——匹配方括號中的任意一個
例如:pat = 't[aeio]n'; 只匹配tan,Ten,tin和toN等扎附。
3 方括號中的連接符 '[c1-c2]' ——匹配從字符c1開始到字符c2結(jié)束的字母序列
4 \n 等 ——特殊字符
下面是一些匹配單個字符的轉(zhuǎn)義字符正則表達式及所匹配的值。
\xN或\x{N} 匹配八進制數(shù)值為N的字符
\oN或\o{N} 匹配十六進制數(shù)值為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等表中的轉(zhuǎn)義字符有所不同饼记,\w,\s,\d等匹配的不是某個特定的字符香伴,而是某一類字符。具體說明如下:
\w匹配任意的單個文字字符具则,相當于[a-zA-Z0-9_];
\s匹配任意的單個空白字符即纲,相當于[\t\f\n\r];
\d匹配任意單個數(shù)字博肋,相當于[0-9]低斋;
\S匹配除空白符以外的任意單個字符,相當于[^ \t\f\n\r]——方括號中的^表示取反匪凡;
\W匹配任意單個字符膊畴,相當于[^a-zA-Z0-9_];
\D匹配除數(shù)字字符外的任意單個字符病游,相當于[^0-9]唇跨。
第二部分串的匹配
1.多次匹配{nstart,nend}
比如,我們要匹配'ppp',那么就可以用正則表達式'ppp'衬衬,還可以記為'p{3}'买猖。
正則表達式中的'{}'用來表示匹配前面的表達式的出現(xiàn)次數(shù)。就是說滋尉,'p{2,3}'玉控,匹配'pp'和'ppp'。例如:
expr? 與expr匹配的元素出現(xiàn)0或1次狮惜,相當于{0,1}
expr* 與expr匹配的元素出現(xiàn)0次或更多高诺,相當于{0,}
expr+ 與expr匹配的元素出現(xiàn)1次或更多,相當于{1,}
expr{n} 與expr匹配的元素出現(xiàn)n次碾篡,相當于{n,n}
expr{n,} 與expr匹配的元素至少出現(xiàn)n次
expr{n,m} 與expr匹配的元素出現(xiàn)n次但不多于m次
(1)假設(shè)匹配號碼格式999-99-9999:[0-9]{3}-[0-9]{2}-[0-9]{4}
(2)若連字符號可以出現(xiàn)也可以不出現(xiàn):[0-9]{3}-?[0-9]{2}-?[0-9]{4}
(3)使用expr*時懒叛,matlab將盡可能的匹配最長的字符子串。
(4)如果我們希望匹配盡可能短的字符子串時耽梅,可以在上面我們使用的字符串后使用'?',也就是expr*?,如:
>> str='<tr valign=top><td><a name="19184"></a>xyz';
regexp(str, '<.*?>', 'match')
ans =
'<tr valign=top>' '<td>' '<a name="19184">' '</a>'
regexp(str, '<.*>', 'match')
ans =
'<tr valign=top><td><a name="19184"></a>'
(5)expr*+
先執(zhí)行expr*,"游標"(如果有的話)就指到了與expr*匹配的字符子串的最末端,然后從那里開始再檢查下一個字符與后面的表達式是否匹配胖烛,如果匹配就繼續(xù)向前(如果一直成功則返回最長的字符串)眼姐,如果不匹配則直接返回空诅迷。
2.邏輯運算符
'exp|exp2':或
(expr) 將expr標記為一組、匹配expr众旗,并將匹配的字符子串標記起來以供后面使用罢杉。
(?:expr) 說明expr為一組,相當于數(shù)學(xué)表達式中的()
lstr='A body or collection of such stories';
regexp(lstr, '(?:[^aeiou][aeiou]){2,}', 'match');
ans =
'tori'
% [^aeiou]表示除aeiou以外的字符贡歧,即輔音字符(其實空格等也會被算入)
% [aeiou]表示元音字符
% (?:)輔音字符+元音字符形成一個音節(jié)
% (?:){2}兩個音節(jié)
上面的表達式中{2,}對[^aeiou][aeiou]起作用滩租,如果去掉分組,則只對[aeiou]起作用利朵,如下所示:
regexp(lstr,'[^aeiou][aeiou]{2,}','match')
ans =
'tio' 'rie'
(?>expr) expr中的每個元素是一個分組
(?#expr) expr放在(?#和)之間是就是注釋律想。
^expr 匹配expr,并且出現(xiàn)在原字符串最前端的子串
expr$ 匹配expr绍弟,并且出現(xiàn)在原字符串最末端的子串
<expr 匹配expr技即,并且出現(xiàn)在一個單詞最前端的子串
expr> 匹配expr,并且出現(xiàn)在一個單詞最末端的子串
<expr> 更嚴格的單詞匹配樟遣,如:以s開頭而叼,并且以h結(jié)尾的單詞
lstr='A body or collection of such stories';
regexp(lstr, 's\w*h', 'match')
ans =
'such'
- 左顧右盼——利用上下文匹配
這個也比較容易理解。就是利用上下文的匹配來找到我們要找的內(nèi)容豹悬。
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'
(?<=expr1)expr2 找到匹配expr2的子串,如果其前面的字符串也匹配expr1
下面的例子查找所有在','之后的單詞瞻佛,注意:','之后可能有空格脱篙,所以是【,\s*】,而不是僅僅【,】
regexpi(pstr,'(?<=,\s*)\w*','match')
ans =
'nearly' 'suddenly'
(?<!expr1)expr2 找到匹配expr2的子串,如果其后的字符串不匹配expr1
下面的例子查找所有不在','之后的單詞涤久,
regexpi(pstr,'(?<!,\s*)\w*','match')
ans =
Columns 1 through 6
'While' 'I' 'nodded' 'early' 'napping' 'uddenly'
Columns 7 through 10
'there' 'came' 'a' 'tapping'
轉(zhuǎn)載自:http://blog.163.com/zzz216@yeah/blog/static/1625546842014120962775/