【问题标题】:NSRegularExpression with french character带有法语字符的 NSRegularExpression
【发布时间】:2015-01-08 16:20:25
【问题描述】:

为什么要模式

[A-Z][A-z]*

使用 NSRegularExpression 为法语单词 Vénus 返回 Ve。我想匹配骆驼单词,但是这个单词很奇怪

【问题讨论】:

  • 提问前有没有搜索过答案? “当指定字符范围时,例如 [a-Z](即小写 a 到大写 z),计算机的区域设置通过字符编码的数字顺序确定内容。” - en.wikipedia.org/wiki/Regular_expression#Character_classes
  • @Onots:NSRegularExpression 不是这样。你引用的是POSIX正则表达式的行为,这里不适用。
  • @nhahtdh:感谢您指出这一点。所以我今天google了一下,学到了一些东西:NSRegularExpression使用了ICU指定的模式语法。来自 ICU 站点:“[A-M] 范围 - 匹配从 A 到 M 的任何字符。要包含的字符由 Unicode 代码点排序决定”。
  • 但是为什么“[A-Z][A-z']*”适用于“Vénus”返回“Ve”,而不是“Vé”或“Venus”或“Vénus”使用 NSRegularExpression

标签: regex nsregularexpression


【解决方案1】:

您的正则表达式匹配Ve 而不是 的原因是因为there are two ways to represent an é 在Unicode 中:

  • 使用标准化的单个代码点U+00E9
  • 使用“分解”形式:e,后跟组合标记´ (U+0065 U+0301)。请注意,后者不是实际的“独立”´ 字符 (U+00B4)。

您的字符串显然是使用第二个选项编码的。因此[A-z] 只匹配组合字符的前半部分。由于以下 ´ 不匹配,因此正则表达式在此时停止。您应该先规范化字符串,然后再对其应用正则表达式。

此外,使用[A-Za-z] 代替[A-z]。否则,还会匹配一些非字母字符,如^]

【讨论】:

  • 不,我没有测试过,我只是要删除我的答案,因为它充满了错误。
  • 现在,在阅读nshipster.com/cfstringtransform.Thx 的帖子后,我完全理解你了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
  • 2011-09-29
  • 2014-04-20
  • 1970-01-01
  • 1970-01-01
  • 2017-02-21
  • 1970-01-01
相关资源
最近更新 更多