原始答案
这里是一个函数,你可以利用它来获取捕获组文本:
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))
}
}
然后:
var result = "&l=(\\d{8,})".firstMatchIn(yourAccountNumber, atRangeIndex: 1)
在
atRangeIndex: 1
中的
1
将提取由
(\d{8,})
捕获组捕获的文本。
注意1:如果您计划在&l=
后提取8个数字,您不需要在限定量词中使用,
,因为{8,}
表示8或更多。如果您只想捕获8个数字,请改为使用{8}
。
注意2:NSMatchingAnchored
是您希望避免的内容,如果您期望的结果不在搜索范围的开头。请参阅文档:
指定匹配仅限于搜索范围的开头。
注意3:谈到“最简单”的事情时,我建议您避免使用环视(look-arounds),除非您没有必要。环视通常会对性能产生一些影响,如果您不打算捕获重叠文本,我建议您使用捕获组。
SWIFT 2的更新
我想出了一个函数,它将返回所有带有所有捕获组的匹配项(类似于PHP中的preg_match_all
)。以下是在您的场景中使用它的方法:
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 yourAccountNumber = "index.php?page=index&l=99182677"
let matches = regMatchGroup("&l=(\\d{8,})", text: yourAccountNumber)
if (matches.count > 0)
{
print(matches[0][1])
}