正则表达式的范围匹配忽略Swift中的case和变音符号

时间:2016-07-27 08:26:20

标签: ios swift macos

我试图弄清楚如何在字符串中找到正则表达式匹配的范围。搜索需要对案例和变音符号不敏感。我尝试过这样的事情:

"München".rangeOfString(
    "[mno][tuv][mno]",
    options: [
        .RegularExpressionSearch,
        .DiacriticInsensitiveSearch,
        .CaseInsensitiveSearch],
    range: nil,
    locale: nil)

.RegularExpressionSearch似乎与.DiacriticInsensitiveSearch一起工作。

我尝试使用stringByFolding方法在搜索之前转换字符串。此方法的问题在于它将ß转换为ss,从而更改字符串的长度并可能使结果范围无效。

2 个答案:

答案 0 :(得分:0)

除非你以这种方式编写表达式,否则无法使正则表达式变得不那么敏感。最终引用是unicode regular expression standard。这里的示例显示了如何规范匹配的字符。您必须明确列出它们,但这是我知道的唯一方法。

支持unicode的正则表达式引擎可以选择在匹配之前规范化字符串。我无法找到任何文件说Apple / ICU是否这样做。

答案 1 :(得分:0)

如文档中所述,关于String.CompareOptions.regularExpression

  

...   如果设置,除了caseInsensitive和之外,不能应用其他选项   anchored。 ...

因此,您无法将diacriticInsensitiveregularExpression选项合并。

为了实现变音符号不敏感的正则表达式,可以使用Unicode类别\p{L}来匹配字母字符。可以在此处找到更多Unicode类别:https://www.regular-expressions.info/unicode.html