【问题标题】:Regex Works in Perl, Doesn't as NSRegularExpresson正则表达式在 Perl 中工作,不像 NSRegularExpresson
【发布时间】: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


【解决方案1】:

我不认为条件测试(?(1)...|...) 可用,但它不是真正的问题,因为它不需要。这个模式也是一样的:

let pattern = "'(?:(?<=[^\\s[{(-]')|(?=\\s | s\\b))"

注意:如果不起作用,请尝试对字符类中的左方括号进行双重转义。

【讨论】:

  • 这种模式,在第一个 [ 之前有双反斜杠,确实修复了错误,但它不起作用将 ' 替换为 &amp;#8217;
  • @davextreme:请注意,由于此模式中没有更多捕获组,因此替换必须为:let template = "&amp;#8217;"
  • 已解决:s | s 中的空格导致了问题。将其取出或添加 .AllowCommentsAndWhitespace 即可:let pattern = "'(?:(?&lt;=[^\\s[{(-]')|(?=\\s | s\\b))"let regex = NSRegularExpression(pattern: pattern, options: .CaseInsensitive | .AllowCommentsAndWhitespace, error: &amp;anError)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 2022-10-14
  • 2020-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多