【问题标题】:Different between javascript regex and swift regexjavascript正则表达式和swift正则表达式之间的区别
【发布时间】:2016-11-18 19:36:08
【问题描述】:

最近我从 javascript 正则表达式中创建了一个 swift 正则表达式来检测 unicode 字体和其他不遵循 unicode 标准的字体。但现在我遇到了转换它的问题。问题是 \s\u1031 javascript 正则表达式模式不允许在 swift 中。

var regexZG = new RegExp("\s\u1031|\u1031[^\u1000-\u1021\u103b\u1040\u106a\u106b\u107e-\u1084\u108f\u1090]| ေ[က-အ]်|[က-အ]း","g");

我怎样才能用 swift 重写它,它也能在 swift 中工作?

【问题讨论】:

    标签: javascript swift unicode ios9


    【解决方案1】:

    Swift 对任意 unicode 字符有不同的语法,\u{n}

    任意 Unicode 标量,写为 \u{n},其中 n 是一个 1-8 位的十六进制数,其值等于有效的 Unicode 代码点

    https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/StringsAndCharacters.html#//apple_ref/doc/uid/TP40014097-CH7-ID293

    所以,在您的情况下,它是 \u{1031} 而不是 \u1031

    【讨论】:

      【解决方案2】:

      您的正则表达式在 Javascript 中也可能是错误的。将new RegExp() 与文字字符串一起使用意味着正则表达式必须先通过字符串文字解析,然后才能将其解析为正则表达式。这反过来意味着\s 变成了一个普通的s - 匹配文字“s”,而不是空格。

      在 Swift 中,您不能在任意字符前面放置反斜杠,因此您会收到 invalid escape sequence in literal 错误。

      在 Javascript 中,您应该改用正则表达式:

      var regexZG = /\s\u1031|\u1031[^\u1000-\u1021\u103b\u1040\u106a\u106b\u107e-\u1084\u108f\u1090]| ေ[က-အ]်|[က-အ]း/g;
      

      在 Swift 中,您需要将特殊正则表达式序列中的反斜杠加倍,例如 \s

      另一个问题是 Swift 中的 Unicode 转义格式为 \u{XXXX} 而不仅仅是 \uXXXX,因此您需要在 \u 表达式中的所有代码点值周围加上花括号。

      所以 Swift 版本看起来像这样:

      "\\s\u{1031}|\u{1031}[^\u{1000}-\u{1021}\u{103b}\u{1040}\u{106a}\u{106b}\u{107e}-\u{1084}\u{108f}\u{1090}]| ေ[က-အ]်|[က-အ]း"
      

      【讨论】:

        猜你喜欢
        • 2012-02-22
        • 2023-04-07
        • 2012-06-01
        • 2013-09-18
        • 2016-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-17
        相关资源
        最近更新 更多