iOS - 正则表达式匹配单词边界,包括下划线

时间:2015-11-17 21:13:34

标签: ios regex swift

我有一个正则表达式,我试图运行以匹配各种搜索字词。例如:

搜索" old"应匹配: - > age_old - >老年 但不是 - >大胆 - 因为它不在单词的开头

为此,我使用的是单词边界。但是,单词边界并未考虑下划线。如上所述[{3}},其他语言中提供了解决方法。不幸的是,使用NSRegularExpression,这看起来并不可行。有没有其他方法可以使单词边界工作?还是其他选择?

1 个答案:

答案 0 :(得分:3)

Swift和Objective C支持ICU regex flavor。这种味道支持固定和约束宽度的后视镜。

  

(?= ... ) 前瞻断言。如果带括号的模式在当前输入位置匹配但不提前输入位置,则为真。

     

(?! ... ) 否定前瞻声明。如果括号模式在当前输入位置不匹配,则为True。不提前输入位置。

     

(?<= ... ) 后面的断言。如果带括号的模式与当前输入位置之前的文本匹配,则为真,其中匹配的最后一个字符是当前位置之前的输入字符。不改变输入位置。 由后视图案匹配的可能字符串的长度不得无限制(无*或+运算符。)

     

(?<! ... ) 否定后瞻断言。

所以,你可以使用

 let regex = "(?<![\\p{L}\\d])old(?![\\p{L}\\d])";

请参阅regex demo

这是提取所有“旧”的Swift code snippet

func matchesForRegexInText(regex: String, text: String) -> [String] {

    do {
        let regex = try NSRegularExpression(pattern: regex, options: [])
        let nsString = text as NSString
        let results = regex.matchesInString(text,
            options: [], range: NSMakeRange(0, nsString.length))
        return results.map { nsString.substringWithRange($0.range)}
    } catch let error as NSError {
        print("invalid regex: \(error.localizedDescription)")
        return []
    }
}

let s = "age_old -> old_age but not -> bold"
let rx = "(?<![\\p{L}\\d])old(?![\\p{L}\\d])"
let matches = matchesForRegexInText(rx, text: s)
print(matches) // => ["old", "old"]