Почему NSRegularExpression не совпадает при заголовке цитаты? - PullRequest
0 голосов
/ 19 сентября 2018

Вот весь пример, который должен соответствовать:

   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)

В настоящее время регулярное выражение не захватывает ни одну группу.Я ожидаю, что в качестве первой группы будет записан «iPhone XR».

Вот тестовый стенд: https://regex101.com/r/aHcyPQ/2

1 Ответ

0 голосов
/ 19 сентября 2018

.useUnicodeWordBoundaries включает параметр UREGEX_UWORD:

Управляет поведением \b в шаблоне.Если установлено, границы слова находятся в соответствии с определениями слова, найденными в Unicode UAX 29, «Текстовые границы».По умолчанию границы слова идентифицируются с помощью простой классификации символов как «слово» или «не слово», что приблизительно соответствует традиционному поведению регулярного выражения.Результаты, полученные с использованием этих двух параметров, могут сильно различаться в сериях пробелов и других несловарных символов.

Документ Unicode UAX 29 подробно описывает эти границы слов и предоставляетнесколько хороших иллюстраций.

относится к типу символов MidLetter:

MidLetter Any of the following:U+0027 (') APOSTROPHEU+00B7 (·) MIDDLE DOTU+05F4 (״) HEBREW PUNCTUATION GERSHAYIMU+2019 (’) RIGHT SINGLE QUOTATION MARK (curly apostrophe)U+2027 (‧) HYPHENATION POINT

enter image description here

Таким образом, не существует границы слова Unicode между L и i в L’iPhone, удалите .useUnicodeWordBoundaries.

...