我有一个正则表达式,我试图运行以匹配各种搜索字词。例如:
搜索" old"应匹配: - > age_old - >老年 但不是 - >大胆 - 因为它不在单词的开头
为此,我使用的是单词边界。但是,单词边界并未考虑下划线。如上所述[{3}},其他语言中提供了解决方法。不幸的是,使用NSRegularExpression,这看起来并不可行。有没有其他方法可以使单词边界工作?还是其他选择?
答案 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"]