从字符串中提取 5 位邮政编码
Extract 5 digit zip code from string
我让用户输入他们的地址,我需要从中提取邮政编码。
我发现这个 RegEx 应该可以工作:\d{5}([ \-]\d{4})?
但是我很难让它在 Swift 上工作。
这是我所在的位置:
private func sanatizeZipCodeString() -> String {
let retVal = self.drugNameTextField.text
let regEx = try! NSRegularExpression(pattern: "", options: .CaseInsensitive)
let match = regEx.matchesInString(retVal!, options: [], range: NSMakeRange(0, (retVal?.characters.count)!))
for zip in match {
let matchRange = zip.range
}
}
我不明白为什么我不能只把第一个匹配的字符串拉出来!
您可以使用
"\b\d{5}(?:[ -]\d{4})?\b"
单词边界确保您只匹配整个单词 ZIP。
反斜杠必须加倍。
字符 class 末尾的连字符不必转义。
使用方法:
func regMatchGroup(regex: String, text: String) -> [[String]] {
do {
var resultsFinal = [[String]]()
let regex = try NSRegularExpression(pattern: regex, options: [])
let nsString = text as NSString
let results = regex.matchesInString(text,
options: [], range: NSMakeRange(0, nsString.length))
for result in results {
var internalString = [String]()
for var i = 0; i < result.numberOfRanges; ++i{
internalString.append(nsString.substringWithRange(result.rangeAtIndex(i)))
}
resultsFinal.append(internalString)
}
return resultsFinal
} catch let error as NSError {
print("invalid regex: \(error.localizedDescription)")
return [[]]
}
}
let input = "75463 72639823764 gfejwfh56873 89765"
let matches = regMatchGroup("\b\d{5}(?:[ -]\d{4})?\b", text: input)
if (matches.count > 0)
{
print(matches[0][0]) // Print the first one
}
你可以试试这个
func match() {
do {
let regex = try NSRegularExpression(pattern: "\b\d{5}(?:[ -]\d{4})?\b", options: [])
let retVal = "75463 72639823764 gfejwfh56873 89765"
let str = retVal as NSString
let postcodes = regex.matchesInString(retVal,
options: [], range: NSMakeRange(0, retVal.characters.count))
let postcodesArr = postcodes.map { str.substringWithRange([=10=].range)}
// postcodesArr[0] will give you first postcode
} catch let error as NSError {
}
}
我让用户输入他们的地址,我需要从中提取邮政编码。
我发现这个 RegEx 应该可以工作:\d{5}([ \-]\d{4})?
但是我很难让它在 Swift 上工作。
这是我所在的位置:
private func sanatizeZipCodeString() -> String {
let retVal = self.drugNameTextField.text
let regEx = try! NSRegularExpression(pattern: "", options: .CaseInsensitive)
let match = regEx.matchesInString(retVal!, options: [], range: NSMakeRange(0, (retVal?.characters.count)!))
for zip in match {
let matchRange = zip.range
}
}
我不明白为什么我不能只把第一个匹配的字符串拉出来!
您可以使用
"\b\d{5}(?:[ -]\d{4})?\b"
单词边界确保您只匹配整个单词 ZIP。
反斜杠必须加倍。
字符 class 末尾的连字符不必转义。
使用方法:
func regMatchGroup(regex: String, text: String) -> [[String]] {
do {
var resultsFinal = [[String]]()
let regex = try NSRegularExpression(pattern: regex, options: [])
let nsString = text as NSString
let results = regex.matchesInString(text,
options: [], range: NSMakeRange(0, nsString.length))
for result in results {
var internalString = [String]()
for var i = 0; i < result.numberOfRanges; ++i{
internalString.append(nsString.substringWithRange(result.rangeAtIndex(i)))
}
resultsFinal.append(internalString)
}
return resultsFinal
} catch let error as NSError {
print("invalid regex: \(error.localizedDescription)")
return [[]]
}
}
let input = "75463 72639823764 gfejwfh56873 89765"
let matches = regMatchGroup("\b\d{5}(?:[ -]\d{4})?\b", text: input)
if (matches.count > 0)
{
print(matches[0][0]) // Print the first one
}
你可以试试这个
func match() {
do {
let regex = try NSRegularExpression(pattern: "\b\d{5}(?:[ -]\d{4})?\b", options: [])
let retVal = "75463 72639823764 gfejwfh56873 89765"
let str = retVal as NSString
let postcodes = regex.matchesInString(retVal,
options: [], range: NSMakeRange(0, retVal.characters.count))
let postcodesArr = postcodes.map { str.substringWithRange([=10=].range)}
// postcodesArr[0] will give you first postcode
} catch let error as NSError {
}
}