今天在這邊卡了很久
可能是因為講師的說明有點讓人誤會
論壇也超多人問,但是好像Quiz有這題的樣子
助教回答也是很模糊,避免把答案講出來了
筆記一下
x = 'From steph@uct.ac.ze Sat Jan'
假設上面這個string
\S 表示 非空白字元
+ 表示出現1~∞次
? 表示換成non-greedy模式
[Q]
我用 \S+?@\S+? 去比對
為何是得到
['steph@'] 而不是 ['h@u'] ?
[解答]
預設若用\S+@\S+ 會是 greedy模式尋找
比對出['steph@uct.ac.ze']
greedy就是當比對出好幾個結果時,會選擇範圍最大的
所以符合的結果有
steph@u
steph@uc
steph@uct
一直到
steph@uct.ac.ze
改成\S+?@\S+? 時
我把regex引擎比對步驟描述如下:
一開始先找非空白字元
所以從開頭F開始比對 F 非空白 所以成功
接著Fr 比對 F@失敗
=> 引擎會expand 成 Fr@去比對,還是失敗
繼續expand 直到From後面有空白 所以從頭來過
從空白右邊的s開始比對s成功,
s@失敗
st@失敗
直到
steph@成功!!
再接著比對steph@u 也成功!
再比對steph@uc 也成功!
但因為non-greedy 所以取最小的範圍
所以得到steph@u
[補充]
"\S+?@\S+?" 和 "\S+@\S+?"
比對stephen@marquard@uct.ac.za
會有不同的結果
可以去測試regex網站玩玩看
https://regex101.com/
參考資源
https://www.regular-expressions.info/repeat.html