我正在用代码获取对http post请求的响应

let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {data, response, error in

if error != nil {
println("error=\(error)")
return
}
// Get the response to the HTTP POST
var responseString = NSString(data: data, encoding: NSUTF8StringEncoding)!}
task.resume()

我试图定义两个正则表达式
let regex0: NSRegularExpression = NSRegularExpression(pattern: "<b>District Representatives:</b>", options: NSRegularExpressionOptions.DotMatchesLineSeparators, error: nil)!

let regex1: NSRegularExpression = NSRegularExpression(pattern: "\\A.*<b>District Representatives:</b>.*href=\"http://www\.sec\.state\.ma\.us/ele/eledist/con11idx\.htm#D[1-9]\" target=\"_blank\">(.*?)</a>.*href=\"http://www\.sec\.state\.ma\.us/ele/eledist/sen11idx\.htm#[0-9]{0,5}[a-z]{1,20}\" target=\"_blank\">(.*?)</a>.*\"http://www\.sec\.state\.ma\.us/ele/eledist/reps11idx\.htm#[a-z]{1,13}[0-9]{0,2}\" target=\"_blank\">(.*?)</a>.*\\z", options: NSRegularExpressionOptions.DotMatchesLineSeparators, error: nil)!

但是xcode在regex1的定义上给了我一个错误消息“expression”。
我想测试responsestring是否与regex0匹配。我试着用
var numberOfMatches: Int = regex0.numberOfMatchesInString(responseString, options:nil, range: (NSMakeRange(0, responseString.length)))

但我收到了错误消息“使用未解析标识符responsestring”
我想知道如何测试正则表达式匹配是否成功。在这种情况下,我可以测试responsestring是否包含我的测试字符串。这在swift字符串中似乎很有效,但我不能让它与nsstring一起工作。
我认为regex1正则表达式中的模式是可以的,因为我在textwrangler中测试了等价的模式。我用的模式是
(?s)\A.*<b>District Representatives:</b>.*href="http://www\.sec\.state\.ma\.us/ele/eledist/con11idx\.htm#D[1-9]" target="_blank">(.*?)</a>.*href="http://www\.sec\.state\.ma\.us/ele/eledist/sen11idx\.htm#[0-9]{0,5}[a-z]{1,20}" target="_blank">(.*?)</a>.*"http://www\.sec\.state\.ma\.us/ele/eledist/reps11idx\.htm#[a-z]{1,13}[0-9]{0,2}" target="_blank">(.*?)</a>.*\z

唯一的(有意的)区别是,在swift文本中,所有的双引号和反斜杠都必须用反斜杠转义,而textwrangler模式以(?)s)这相当于nsregularexpressionoptions.dotmatcheslineseparators。
我想使用regex1修改responsestring如下
responseString.replaceMatchesInString(options: nil, range: NSMakeRange(0, responseString.length), withTemplate template: "$1\t$2\t$3")

但那也没用。
我天真地以为,既然我已经使用正则表达式30年了,那部分就很容易了。显然不是。

最佳答案

文本点上缺少双转义符(请参见)。
正确的regex1声明将是

@"\\A.*<b>District Representatives:</b>.*href=\"http://www\\.sec\\.state\\.ma\\.us/ele/eledist/con11idx\\.htm#D[1-9]\" target=\"_blank\">(.*?)</a>.*href=\"http://www\\.sec\\.state\\.ma\\.us/ele/eledist/sen11idx\\.htm#[0-9]{0,5}[a-z]{1,20}\" target=\"_blank\">(.*?)</a>.*\"http://www\\.sec\\.state\\.ma\\.us/ele/eledist/reps11idx\\.htm#[a-z]{1,13}[0-9]{0,2}\" target=\"_blank\">(.*?)</a>.*\\z"

使用未解析的标识符responsestring可能是因为在声明和使用regex1的方法之外声明了www\.sec\.state\.ma\.us

10-08 07:43