import Foundation
let pattern = #"(.*)@(?!gmail)\w+\.com"#
let regex = try! NSRegularExpression(pattern: pattern)
let testString = ##"""
# 配對電子郵件
# 題目說明區塊
請幫我抓出@(小老鼠)前面的帳戶名稱,而且我不要 gmail 的。
#欲測試資料集
foobar@gmail.com
NoOneCareMe@gamil.com
SaveTheWorld@hotmail.com
zzzGroup@yahoo.com
eagle1963@gmail.com
maythefourthwithyiu@starwars.com
# 應配對結果(亮色區塊)
NoOneCareMe@gamil.com
SaveTheWorld@hotmail.com
zzzGroup@yahoo.com
maythefourthwithyiu@starwars.com
# (選項)寫上註解,好好說明你怎麼想的
首先將 @ 之前的文字都抓起來,所以放上(),因為不想顧及裡面的文字是什麼,所以很懶惰的使用 .*,步驟多了點但是我不在意XD,因為不想要 gmail 所以我再任意文字 \w+ 前面判斷寫上不是 gmail,最後放上 \.com來玩成此次配對,希望你可以幫我減少更多 step(步驟),來提高這個規則的效率。
# (選項)將你的 Regex 註解起來,使用 Extended Formating
/ # Start of Regex
( # Group and Capturing follwoing
.* # Match any form zero-to-many
) # End of group
@ # Match @
( # Group and Capturing follwoing
?! # Negative lookahead
gmail # Match Gmail
) # End of group
\w+ # Match any character from one-to-many
\. # Match .(dot)
com # Match com
/ # End of Regex
"""##
let stringRange = NSRange(location: 0, length: testString.utf16.count)
let matches = regex.matches(in: testString, range: stringRange)
var result: [[String]] = []
for match in matches {
var groups: [String] = []
for rangeIndex in 1 ..< match.numberOfRanges {
let nsRange = match.range(at: rangeIndex)
guard !NSEqualRanges(nsRange, NSMakeRange(NSNotFound, 0)) else { continue }
let string = (testString as NSString).substring(with: nsRange)
groups.append(string)
}
if !groups.isEmpty {
result.append(groups)
}
}
print(result)
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Swift 5.2, please visit: https://developer.apple.com/documentation/foundation/nsregularexpression