我在Swift中创建一个应用程序,我需要从字符串中捕获8个数字.这是字符串:
index.php?page=index&l=99182677
我的模式是:
&l=(\d{8,})
这是我的代码:
var yourAccountNumber = "index.php?page=index&l=99182677"
let regex = try! NSRegularExpression(pattern: "&l=(\\d{8,})", options: NSRegularExpressionOptions.CaseInsensitive)
let range = NSMakeRange(0, yourAccountNumber.characters.count)
let match = regex.matchesInString(yourAccountNumber, options: NSMatchingOptions.Anchored, range: range)
Run Code Online (Sandbox Code Playgroud)
首先,我不知道NSMatchingOptions在官方的Apple库上有什么方法,我没有得到所有的.Anchored,.ReportProgress等东西.任何人都可以照亮我吗?
然后,当我print(match),那个变量([])似乎没有任何内容.
我正在使用Xcode 7 Beta 3和Swift 2.0.
这是一个可以用来获取捕获的组文本的函数:
import Foundation
extension String {
func firstMatchIn(string: NSString!, atRangeIndex: Int!) -> String {
var error : NSError?
let re = NSRegularExpression(pattern: self, options: .CaseInsensitive, error: &error)
let match = re.firstMatchInString(string, options: .WithoutAnchoringBounds, range: NSMakeRange(0, string.length))
return string.substringWithRange(match.rangeAtIndex(atRangeIndex))
}
}
Run Code Online (Sandbox Code Playgroud)
然后:
var result = "&l=(\\d{8,})".firstMatchIn(yourAccountNumber, atRangeIndex: 1)
Run Code Online (Sandbox Code Playgroud)
将1在atRangeIndex: 1将提取由捕获文本(\d{8,})捕获组.
注1:如果您计划提取8,只有8位后&l=,你不需要,在限制量词,如{8,}意味着8个或更多.{8}如果您打算仅捕获8位数,请更改为.
注意2:NSMatchingAnchored如果您的预期结果不在搜索范围的开头,您希望避免这种情况.见文档:
指定匹配仅限于搜索范围开头的匹配.
注3:谈到"最简单"的事情,我建议你不要在不必要的时候使用环顾四周.环视通常会带来性能成本,如果您不打算捕获重叠文本,我建议使用捕获组.
我已经提出了一个函数,它将返回所有匹配所有捕获组(类似于preg_match_allPHP).这是一种将它用于您的场景的方法:
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 [[]]
}
}
// USAGE:
let yourAccountNumber = "index.php?page=index&l=99182677"
let matches = regMatchGroup("&l=(\\d{8,})", text: yourAccountNumber)
if (matches.count > 0) // If we have matches....
{
print(matches[0][1]) // Print the first one, Group 1.
}
Run Code Online (Sandbox Code Playgroud)