我使用这个正则表达式模式:@[a-zA-Z0-9-_]+
来匹配字符串中的@usernames。
嘿,@alex
,whatsup@brian
@mary
冷光
grey
中突出显示的文本是regex模式返回的文本,但我希望它在@字符之后返回所有。所以我真正想要的是:
嘿@alex
,whatsup
@brian
@mary
酷炫照片
我应该如何更改模式?
您应该使用一个正的lookbacking,这需要断言以下内容:我想匹配[a-zA-Z0-9-_]+
,但只有当是("正"(时,才在之前有一个@
(因此,"lookbacking"(。
我不知道Swift正则表达式的具体语法,但大多数引擎使用(?<=...)
进行正向查找。因此:
(?<=@)[a-zA-Z0-9-_]+
如果你愿意,可以在Regex101上玩。
为什么不使用捕获组?将圆括号放在@
后面的字母数字字符上。您的匹配仍然包括@
符号,但您只捕获用户名:
let str = "Hey @alex, whatsup. @brian @mary cool photo"
let len = count(str) // if Swift 2.0 use: str.characters.count
let regex = NSRegularExpression(pattern: "@([a-zA-Z0-9-_]+)", options: nil, error:nil)
let matches = regex!.matchesInString(str, options: nil, range: NSMakeRange(0,len))
let nStr = str as NSString
for m in matches {
let r = m.rangeAtIndex(1)
println(nStr.substringWithRange(r)) // Use print in Swift 2.0
}
我手头没有Swift 2.0编译器,所以如果您使用的是Xcode 7 beta ,请进行一些更改