Swift正则表达式特殊字符

时间:2018-01-03 14:22:06

标签: regex swift locale file-handling

我目前正在使用正则表达式来查找我的应用程序之前创建的一些文件,但我遇到了德语“Umlauten”的问题,如ö,ä,ü。如果字符串中有“Umlaute”,则表达式不匹配。我想这与语言环境有关,但我无法弄清楚要设置的语言环境(已经尝试过nil)。

以下是一些代码:

// Building the regex
var regex = somePrefix + "_("
for string in stringArray{     
     regex += string + "|"  // string can contain öäü
}
regex.remove(at: regex.index(before: regex.endIndex))
regex += ")_w\\d_d\\d"

// Finding files
let fileManager = FileManager()
let files = fileManager.enumerator(atPath: somePath)
while let file = files?.nextObject() {
   let fileName = file as! String            
   if fileName.range(of: regex, options: .regularExpression, range: nil, locale: Locale.current) != nil {
   print(fileName + " found")
   }
}

//一些不匹配的例子:

Regex = reis 8_(Ibedir|Drölf )_w\d_d\d
Filename that didnt match = reis 8_Drölf _w0_d0.plist

1 个答案:

答案 0 :(得分:1)

显然,文件名使用的是不同的Unicode规范化形式 给定的字符串。 Unicode Regular Expression Guidelines: 3.2 Canonical Equivalents建议:

  

在处理之前(或期间),将文本(和图案)翻译成标准化形式。这是最简单的实现,因为有可用的代码库用于规范化。

这可以通过应用.decomposedStringWithCanonicalMapping来实现 模式和文件名。