Regex模式不包括第一个字符



我使用这个正则表达式模式:@[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 ,请进行一些更改

最新更新