今天要來看看一個大家應該不會太陌生,但對我來說每次只要一久不用就會忘掉的正規表示式 (Regular expression)。正規表示式在處理複雜規則的字串很有幫助。而在這四個語言又是如何去使用正規表示式的呢?就讓我們來看看吧!
import re
my_list = []
n = int(input())
for i in range(n):
data = str(input()).split(" ")
name = data[0]
email = data[1]
if re.search(".+@gmail\.com$", email):
my_list.append(name)
my_list.sort()
for name in my_list:
print(name)
re
(官方文件在這)。如上面的程式碼,我們輸入 <name> <email>
,並且透過 re.search
這個 Function 來判斷我們得到的 email
是不是最後屬於 Gmail,如果是的話才把名字給加入到 List my_list
裡頭。而這裡的關鍵在於 re.search
的第一個參數,也就是正規表示式的 Search pattern ".+@gmail\.com$"
,re.search
會看第二個參數,也就是字串,是否有此 Pattern 的存在,如果有的話就回傳一個 Match
的 object,裡面會包含結果的資訊。反之則回 None
。現在我們看看 ".+@gmail\.com$"
,.
代表任何字元,+
代表一個以上,所以 .+
代表一個以上的任意字元,例如 abcde
、1-2-3
等等。而 @gmail\.com$
就是在一個以上的任意字元後有 @gmail.com
的字串,這裡的 \.
是因為 .
本身有它的含義,但我們希望是真的 Match 到 .
所以要跳脫。最後的 $
表示 @gmail.com
要是字串的最後才行。re
中函數們的使用,以及 Search pattern 的寫法可以參考這裡 囉!match, err := regexp.MatchString("i([a-z]+)man", "ironman")
fmt.Println(match)
r, _ := regexp.Compile("i([a-z]+)man")
fmt.Println(r.MatchString("ironman"))
regexp
,以第一行為例 regexp.MatchString("i([a-z]+)man", "ironman")
做的事情是看第二個參數的值 ironman
是不是符合第一個參數 i([a-z]+)man
這個 Pattern。其中 ([a-z]+)
表示小寫的 a 到 z 之中的字母,而且是連續一個以上。Return 的第一個值 match
是個 Boolean,有符合就是 True,反之則為 False。regexp.Compile("i([a-z]+)man")
是先把規則給 Compile 成一個 Regexp
的 Struct (參考),之後就可以直接使用這個 Struct 的方法,包含 MatchString