Regex 将JavaScript正则表达式转换为Swift正则表达式
我正在学习Swift,我正在尝试将一小段JavaScript代码转换为Swift。JavaScript代码使用正则表达式拆分字符串,如下所示:Regex 将JavaScript正则表达式转换为Swift正则表达式,regex,swift,Regex,Swift,我正在学习Swift,我正在尝试将一小段JavaScript代码转换为Swift。JavaScript代码使用正则表达式拆分字符串,如下所示: var text = "blah.clah##something_else"; var parts = text.match(/(^.*?)\#\#(.+$)/); 执行后,部分数组将包含以下内容: ["blah.clah##something_else", "blah.clah", "something_else"] matchesForRegex
var text = "blah.clah##something_else";
var parts = text.match(/(^.*?)\#\#(.+$)/);
执行后,部分
数组将包含以下内容:
["blah.clah##something_else", "blah.clah", "something_else"]
matchesForRegexInText("(^.*?)\\#\\#(.+$)", text: "blah.clah##something_else")
["blah.clah##something_else"]
我想在Swift中复制同样的行为。下面是我编写的使用正则表达式将字符串拆分为字符串数组的Swift代码:
func matchesForRegexInText(regex: String!, text: String!) -> [String] {
do {
let regex = try NSRegularExpression(pattern: regex, options: NSRegularExpressionOptions.CaseInsensitive)
let nsString = text as NSString
let results = regex.matchesInString(text,
options: NSMatchingOptions.ReportCompletion , range: NSMakeRange(0, nsString.length))
as [NSTextCheckingResult]
return results.map({
nsString.substringWithRange($0.range)
})
} catch {
print("exception")
return [""]
}
}
当我使用以下命令调用上述函数时:
["blah.clah##something_else", "blah.clah", "something_else"]
matchesForRegexInText("(^.*?)\\#\\#(.+$)", text: "blah.clah##something_else")
["blah.clah##something_else"]
我得到以下信息:
["blah.clah##something_else", "blah.clah", "something_else"]
matchesForRegexInText("(^.*?)\\#\\#(.+$)", text: "blah.clah##something_else")
["blah.clah##something_else"]
我尝试了许多不同的正则表达式,但都没有成功。正则表达式(^.*?)\\\\\\\\\\\\(.+$)是否正确,或者matchesForRegexInText()函数是否存在问题?我很欣赏你的见解
我使用的是Swift 2和Xcode 7.0 beta版(7A120f)正如我在评论中提到的,您的模式与整个 字符串,因此
regex.matcheInstalling()
返回一个
NSTextCheckingResult
其范围
描述整个字符串。
您要查找的是与捕获组匹配的子字符串
按照你的模式。这些参数可用作范围索引(i)
,且i>=1
:
func matchesForRegexInText(regex: String!, text: String!) -> [String] {
do {
let regex = try NSRegularExpression(pattern: regex, options: [])
let nsString = text as NSString
guard let result = regex.firstMatchInString(text, options: [], range: NSMakeRange(0, nsString.length)) else {
return [] // pattern does not match the string
}
return (1 ..< result.numberOfRanges).map {
nsString.substringWithRange(result.rangeAtIndex($0))
}
} catch let error as NSError {
print("invalid regex: \(error.localizedDescription)")
return []
}
}
正如在注释中已经提到的,您的模式与整个 字符串,因此
regex.matcheInstalling()
返回一个
NSTextCheckingResult
其范围
描述整个字符串。
您要查找的是与捕获组匹配的子字符串
按照你的模式。这些参数可用作范围索引(i)
,且i>=1
:
func matchesForRegexInText(regex: String!, text: String!) -> [String] {
do {
let regex = try NSRegularExpression(pattern: regex, options: [])
let nsString = text as NSString
guard let result = regex.firstMatchInString(text, options: [], range: NSMakeRange(0, nsString.length)) else {
return [] // pattern does not match the string
}
return (1 ..< result.numberOfRanges).map {
nsString.substringWithRange(result.rangeAtIndex($0))
}
} catch let error as NSError {
print("invalid regex: \(error.localizedDescription)")
return []
}
}
如果尝试将results=regex.matcheInstalling(文本,选项:NSMatchingOptions.ReportCompletion,范围:NSMakeRange(0,nsString.length))作为数组,会怎么样?我认为主要的问题是,只将第0组传递给使用
nsString.substringWithRange($0.range)
创建的数组(即仅$0
第1组,整个匹配)。而且您不需要逃避#
s。谢谢您的建议。我做了更改,但它没有更改输出(仍然是[“blah.clah###something#u else”])。我还在返回之前添加了一个print(results.count)
,以打印出数组中的元素数,它是1。如果尝试将let results=regex.matchesisnstring(text,options:NSMatchingOptions.ReportCompletion,range:NSMakeRange(0,nsString.length))作为数组
,会怎么样?我认为主要的问题是,只将第0组传递给使用nsString.substringWithRange($0.range)
创建的数组(即仅$0
第1组,整个匹配)。而且您不需要逃避#
s。谢谢您的建议。我做了更改,但它没有更改输出(仍然是[“blah.clah###something#u else”])。我还添加了一个print(results.count)
,在return
之前打印出数组中的元素数,结果是1。很好。谢谢你的解释和更新的代码。太好了。感谢您的解释和更新的代码。