Ios Swift正则表达式函数更新

Ios Swift正则表达式函数更新,ios,swift,regex,Ios,Swift,Regex,我有以下功能 static func replaceAtSignNotation(_ text : String) -> String { var source = text let wholePattern = "@\\[[a-z0-9-\\-]+\\]\\((\\w+)\\)" let typePattern = "(?<=]\\()[^)]+(?=\\))" if let wholeRange = source.range(of: wholeP

我有以下功能

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)
}
允许我捕获用户名,但有些用户名确实包含“-”,例如:

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

但我现在的正则表达式并没有捕捉到这些案例。你知道我如何调整我的正则表达式以适应这些情况吗?

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

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

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

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

详细信息

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

为什么要使用两种模式?为什么不使用
NSRegularExpression
并使用组来分隔所需内容?使用非捕获组而不是仅为
\w
-
使用字符集是否有优势?@无法忍受亮度示例为
john-user-1
。所以,我假设
-
应该只在单词字符之间。但是为什么是非捕获组呢?为什么不直接执行
\w[\w-]*
?@Abion47我们不知道确切的规则,因此
\w[\w-]*
可能也适用于OP。它与以
-
开头的名称不匹配。非捕获组仅用于对模式进行分组,而不用于记忆模式(因为捕获的值稍后将不会被访问)。但即使用户名可以以连字符开头,OP也可以使用
[\w-]+
(我看到您已将其编辑到您的答案中)。非捕获组为模式添加了什么?
let wholePattern = "@\\[[a-z0-9-]+\\]\\(([\\w-]+)\\)"
                                         ^^^^^^^