代码之家  ›  专栏  ›  技术社区  ›  Stéphane de Luca

为什么NSRegularExpression在标题引用时不匹配?

  •  1
  • Stéphane de Luca  · 技术社区  · 8 年前

       let input = "L’iPhone XR serait un topselling (des prévisions de vente en hausse de 50% avant même sa sortie)"
    
       let pattern = "\\b(iPhones?(\\s*(se|X((s(\\s*Max)?)|r)?|\\d(s|c)?(\\s*(Plus|Pro))?))?)\\b"
    
       let regex: NSRegularExpression
    
       do {
            regex = try NSRegularExpression(pattern: pattern, options: [.caseInsensitive, .useUnicodeWordBoundaries])
        }
        catch let error {
            fatalError("pattern ”\(pattern)” has an issue. \(error.localizedDescription)")
        }
    
        let range = NSMakeRange(0, input.count)
        let matches = regex.matches(in: input, range: range)
    

    目前正则表达式没有捕获任何组。我所期望的是它捕获“iphonexr”作为第一组。

    https://regex101.com/r/aHcyPQ/2

    1 回复  |  直到 8 年前
        1
  •  1
  •   Wiktor Stribiżew    8 年前

    这个 .useUnicodeWordBoundaries 启用 UREGEX_UWORD

    控制的行为 \b 以某种模式。如果设置了,则根据Unicode UAX 29文本边界中的单词定义查找单词边界。默认情况下,通过将字符简单分类为单词或非单词来识别单词边界,这与传统的正则表达式行为相似。使用这两个选项得到的结果在空格和其他非单词字符的运行中可能会有很大的不同。

    Unicode UAX 29 文档详细描述了这些词的边界,并提供了一些很好的插图。

    ’

    中间字母 Any of the following:
    U+0027 (') APOSTROPHE
    U+00B7 (·) MIDDLE DOT
    U+05F4 (×´) HEBREW PUNCTUATION GERSHAYIM
    U+2019 (’) RIGHT SINGLE QUOTATION MARK (curly apostrophe)
    U+2027 (‧) HYPHENATION POINT

    enter image description here

    因此,这两者之间没有Unicode单词边界 L 和 i 在里面 L’iPhone ,删除 .useUnicode边界 .

    推荐文章