4-3 A洏

我們可以使用方括弧([])來列舉所要比對的字元,例如 [aeiou] 就代表要比對母音,例如若要比對「開頭是 b、結尾是 t,且只夾一個母音」的子字串,可見下列範例:

Example 1: 04-通用運算式/regExp10.mstring = 'I bet there is a bat on board'; pattern = 'b[aeiou]t'; [start, finish] = regexp(string, pattern); fprintf('Matched substrings:\n'); for i=1:length(start) % 列印出比對結果 fprintf('\t%d: %s\n', i, string(start(i):finish(i))); endMatched substrings: 1: bet 2: bat

若是連續字母或數字,就可以使用「-」來簡化方括弧中的列舉字元。例如,數字 0 到 9,可以寫成 [0123456789] 或是簡化寫成 [0-9],而 26 個小寫英文字母則可以簡化寫成 [a-z],大寫字母則是 [A-Z]。例如若要比對西元年份,可見下列範例:

Example 2: 04-通用運算式/regExp11.mstring = 'My brother and me were born in 1965 and 1962, respectively.'; pattern = '[0-9][0-9][0-9][0-9]'; [start, finish] = regexp(string, pattern); fprintf('Matched substrings:\n'); for i=1:length(start) % 列印出比對結果 fprintf('\t%d: %s\n', i, string(start(i):finish(i))); endMatched substrings: 1: 1965 2: 1962

事實上,regexp 指令也可以接收向量化的輸入,並產生向量化的輸出,例如:

Example 3: 04-通用運算式/regExp07.mstring = {'Barcelona', 'Y2K', 'MATLAB 7.3'}; pattern = {'lona', '[0-9]', '[A-Z]'}; [start, finish] = regexp(string, pattern)start = [6] [2] [1x6 double] finish = [9] [2] [1x6 double]

其中 start 和 finish 都是 1x3 的異值陣列,而且 start{i} 和 finish{i} 就是 regexp(string{i}, pattern{i}) 所得到的結果。

Hint
上述範例是在 MATLAB 7.x 所得到的結果。若是使用 MATLAB 6.x,得到的 start 和 finish 都是 3x3 的異質陣列,而且 start{i, j} 和 finish{i, j} 就是 regexp(string{i}, pattern{j}) 所得到的結果。

有關方括弧的使用,我們在下面做一個列表整理與說明:

通用式說明及範例比對不成立之字串
[13579]包含 "1" 或 "3" 或 "5" 或 "7" 或 "9" 的字串,例如:"a3b", "1xy""y2k"
[0-9]含數字之字串不含數字之字串
[a-z0-9]含數字或小寫字母之字串不含數字及小寫字母之字串
[a-zA-Z0-9]含數字或字母之字串不含數字及字母之字串
b[aeiou]t"bat", "bet", "bit", "bot", "but""bxt", "bzt"
[^0-9]不含數字之字串(若要比對 ^,請使用 \^)含數字之字串
[^aeiouAEIOU]不含母音之字串(若要比對 ^,請使用 \^)含母音之字串
[^\^]不含 "^" 之字串,例如 "xyz", "abc""xy^", "a^bc"

請注意在上表中,如果將 "^" 放在兩個方括弧中,就代表「否定」,因此 [^aeiouAEIOU] 代表「不含母音之字串」。

另外,若要避掉特殊字元的特殊意義,就要在此字元前加上 "\",例如上表中的最後一列,"^" 在方括弧裡面是代表「否定」,因此若要在方括弧裡面比對 "^",就要使用 "\^",所以「不含 "^" 之字串」的通用式就是 [^\^]。(這可不是一個表情符號喔!)


MATLAB程式設計:進階篇