【发布时间】:2014-09-08 00:13:44
【问题描述】:
我有这个正则表达式:
([^\ \t\r\n\[\{\(\-])?'(?(1)|(?=\s | s\b))
使用以下替换:
$1’
这似乎在 Perl 中有效。给定一个像“所罗门王的矿山”这样的短语,它会将其更改为King Solomon’s Mines,但它会以NSRegularExpression 的形式抛出EXC_BAD_ACCESS 错误。 This test suite 表明语法在 php 和 Python 中有效,但在 Javascript 中无效,而 (?(1) 部分是罪魁祸首。
示例 Swift 代码:
let string = "King Solomon's Mines"
var anError: NSError? = nil
let pattern = "([^\\ \\t\\r\\n\\[\\{\\(\\-])?'(?(1)|(?=\\s | s\\b))"
let regex = NSRegularExpression(pattern: pattern, options: .CaseInsensitive, error: &anError)
let range = NSMakeRange(0, countElements(string))
let template = "$1’"
let newString = regex.stringByReplacingMatchesInString(string, options: nil, range: range, withTemplate: template)
let regex 声明是 Playground 出现错误访问错误的地方。我是否需要修改正则表达式才能使其在 Swift 中运行?
(编辑:忘记为反斜杠添加转义符。我的代码中有这个。)
【问题讨论】:
-
你想用
’替换'? -
let pattern = ...行根本无法编译(几个“文字中的无效转义序列”错误)。 -
您是否正在尝试完全使用该正则表达式? NSRegularExpression 使用 ICU 正则表达式,而不是 Perl 正则表达式。两种风格之间存在差异,以及需要转义 Swift 中的某些字符串,例如反斜杠。确保正则表达式匹配 ICU 正则表达式语法以及 Swift 字符串所需的转义。
-
哦,我的代码中的反斜杠被转义了。我只是从字符串的输出而不是我的代码中粘贴它。我已经编辑了 Q。
标签: regex swift nsregularexpression