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