【问题标题】:Swift regex function updateSwift 正则表达式函数更新
【发布时间】:2018-08-30 20:25:27
【问题描述】:

我有以下功能

static func replaceAtSignNotation(_ text : String) -> String {
    var source = text
    let wholePattern = "@\\[[a-z0-9-\\-]+\\]\\((\\w+)\\)"
    let typePattern = "(?<=]\\()[^)]+(?=\\))"

    if let wholeRange = source.range(of: wholePattern, options: .regularExpression) {
        if let typeRange = source.range(of: typePattern, options: .regularExpression) {
            let username = source[typeRange]
            source.replaceSubrange(wholeRange, with: "@\(username)")
        }
    } else {
        return text
    }
    return replaceAtSignNotation(source)
}

在寻找模式方面做得很好,例如:

@[a12-3asd-32](john) 
@[b12-32d1-23](martha)

并允许我捕获用户名,但某些用户名确实包含“-”,例如:

@[c12-12d1-13](john-user-1)

但我当前的正则表达式没有捕捉到这些情况。知道如何调整我的正则表达式来捕获这些情况吗?

【问题讨论】:

  • 为什么要使用两种模式?为什么不使用NSRegularExpression 并使用组来分隔您想要的内容?

标签: ios swift regex


【解决方案1】:

您可以将第一个正则表达式更改为

let wholePattern = "@\\[[a-z0-9-]+\\]\\((\\w+(?:-\\w+)*)\\)"
                                             ^^^^^^^^^^

请参阅regex demo

或者,如果-s 可以在任何地方并且可以相互跟随,您也可以使用

let wholePattern = "@\\[[a-z0-9-]+\\]\\(([\\w-]+)\\)"
                                         ^^^^^^^

another regex demo

详情

  • @\[ - 文字 @[ 子字符串
  • [a-z0-9-]+ - 1+ 小写 ASCII 字母、数字或 -
  • \]\( - ]( 子字符串
  • (\w+(?:-\w+)*) - 第 1 组:
    • \w+ - 1 个或多个字母、数字或 _
    • (?:-\w+)* - 零个或多个序列
      • - - 一个连字符
      • \w+ - 1+ 个单词字符
  • [\w-]+ - 1 个或多个单词或 - 字符
  • \) - ) 字符。

【讨论】:

  • 使用非捕获组而不是仅使用 \w- 的字符集是否有优势?
  • @UnbearableLightness 例如john-user-1。所以,我认为- 应该只在字字符之间。
  • 但为什么是非捕获组?为什么不直接\w[\w-]*
  • @Abion47 我们不知道确切的规则,所以\w[\w-]* 可能也适用于 OP。它不会匹配以- 开头的名称。非捕获组仅用于对模式进行分组,而不是记住它(因为捕获的值以后不会被访问)。
  • 但即使用户名 可以 以连字符开头,OP 也可以使用 [\w-]+(我看到您已将其编辑到您的答案中)。非捕获组向模式添加了什么?
猜你喜欢
  • 2011-01-31
  • 2015-05-09
  • 1970-01-01
  • 1970-01-01
  • 2013-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多