这是应该匹配的整个样本:
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
答案 0 :(得分:1)
.useUnicodeWordBoundaries
启用UREGEX_UWORD
选项:
控制模式中
\b
的行为。如果设置了该选项,则会根据Unicode UAX 29,文本边界中找到的单词定义找到单词边界。默认情况下,通过简单的字符分类将单词边界标识为“单词”或“非单词”,这近似于传统的正则表达式行为。使用这两个选项获得的结果在空格和其他非单词字符的行中可能会完全不同。
Unicode UAX 29文档详细描述了这些单词边界,并提供了一些很好的插图。
’
被归类为MidLetter字符:
MidLetter
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
因此,L
中i
和L’iPhone
之间没有Unicode字边界,请删除.useUnicodeWordBoundaries
。