【问题标题】:Regex pattern not inclusive of first character正则表达式模式不包括第一个字符
【发布时间】:2023-03-31 00:16:02
【问题描述】:

我正在使用这个正则表达式模式:@[a-zA-Z0-9-_]+ 来匹配字符串中的@usernames。

@alex,whatsup
@brian @mary 好照片

grey 中突出显示的文本是正则表达式模式返回的内容,但我希望它返回 @ 字符之后 的所有内容。所以我真正想要返回的是:

嘿@alex,怎么办
@brian@mary帅照

我应该如何改变模式?

【问题讨论】:

  • 这是在什么语言/环境中执行的?您可以发布您正在使用的代码吗?
  • @SeanBright 我用 swift 写它,但是语言重要吗?我认为该模式对正则表达式是通用的。我正在使用正则表达式测试器来确认匹配。
  • 这很重要,因为提取用户名部分的方式因语言而异。
  • 你想匹配以@开头,但结果中不包含@?如果是这样,请尝试捕获子模式或积极的后视。
  • @RakholiyaJenish 第一个包含“@”,第二个不包含“@”。

标签: regex swift


【解决方案1】:

您应该使用积极的lookbehind,这需要断言以下内容:我想匹配[a-zA-Z0-9-_]+,但前提是(“肯定”)@之前 它(因此,“向后看”)。

我不具体了解 Swift 正则表达式语法,但大多数引擎使用 (?<=...) 进行积极的后视。因此:

(?<=@)[a-zA-Z0-9-_]+

Play with it on Regex101 如果你愿意的话。

【讨论】:

    【解决方案2】:

    为什么不直接使用捕获组?在@ 之后的字母数字字符上放置圆括号。您的匹配项仍包含 @ 符号,但您仅捕获用户名:

    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,请进行一些更改

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-05
      • 1970-01-01
      • 2013-08-06
      相关资源
      最近更新 更多