標籤:regex 集合運算 邏輯 字母 數字 語言 div false 功能
以上介紹了字元組的準系統,它們在常用的語言中都有提供;還有些語言中為字元組提供了更強大的功能,比如Java和.NET就提供了字元組運算的功能,可以在字元組內進行集合運算,在某些情況下這種功能非常實用。
如果要匹配所有的母音字母(為講解簡單考慮,暫時只考慮小寫字母的情況),可以用[aeiou],但是要匹配所有的輔音字母卻沒有什麼方便的辦法,最直接的寫法是[b-df-hj-np-tv-z],不但煩瑣,而且難理解。其實,從26個字母中"減去"母音字母,剩下的就是輔音字母,如果有辦法做這個"減法",就方便多了。
Java語言中提供了這樣的字元組:[[a-z]&&[^aeiou]],雖然初看有點古怪,但仔細看看,也不難理解。[a-z]表示26個英文字母,[^aeiou]表示除母音字母之外的所有字元(還包括大寫字母、數字和各種符號),兩者取交集,就得到"26個英文字母中,除去5個母音字母,剩下的21個輔音字母"。
.NET中也有這樣的功能,只是寫法不一樣。同樣是匹配輔音字母的字元組,.NET中寫作[a-z-[aeiou]],其邏輯是:從[a-z]能匹配的26個字元中,"減去"[aeiou]能匹配的母音字母。相對於Java,這種邏輯更符合直覺,但寫法卻有點古怪--不是[[a-z]-[aeiou]],而是[a-z-[aeiou]]。例1-20集中示範了Java和.NET中的字元組運算。
例1-20 字元組運算
// Java "a".matches("^[[a-z]&&[^aeiou]]$"); // => True "b".matches("^[[a-z]&&[^aeiou]]$"); // => False // .NET Regex.IsMatch("^[a-z-[aeiou]]$", "a"); // => True Regex.IsMatch("^[a-z-[aeiou]]$", "b"); // => False
Regex——字元組運算