gpt4 book ai didi

arrays - 如何从 swift 5 中的正则表达式结果中删除括号?

转载 作者:行者123 更新时间:2023-11-30 10:32:13 47 4
gpt4 key购买 nike

这是我第一次使用 swift,我在学校项目中遇到了一些麻烦

我有以下内容:

var tokens = ["if", "for", "(", ")", "while", "var"]
var test = "if, identifier, for, (, ), while, var1, 3var, ResultVariable, i dentifier";
var lineas = [String]()

我将“test”转换为“lineas”数组:

lineas = data.components(separatedBy: ", ")

然后我创建了以下正则表达式模式来查找“test”字符串中的 id(id 是任何变量名称)

//id: any word that begins with lowercase and can have 0 or more alphanumerics characters
let id = "[a-z][\\w]*"
let regexId = try! NSRegularExpression(pattern: id, options: [])

正则表达式的结果保存在字符串中,然后保存在数组中

let idString = regexId.stringByReplacingMatches(in: test, options: [], range: NSRange(location: 0, length: test.count), withTemplate: "($0)")
let idArray = idString.components(separatedBy: "\n")

然后我尝试将“idArray”与“tokens”数组进行比较以仅获取 ids

let idResults = idArray.filter({!tokens.contains($0)})
print("\nID found\n")
for ids in idResults{
print(ids)
}

但是我得到的输出是:

ID found:
["(if)", "(for)", "(identifier)", "(for)", "(while)", "(var1)", "3(var)", "R(esultVariable)", "(i) (dentifier)"]

当我需要的输出是:

ID found:
["identifier, var1"]

这是因为“3var, ResultVariable, i dentifier”不是标识符,因为它们以数字、大写或有空格开头

最佳答案

这是一个不基于正则表达式的解决方案,而是以不同的方式使用 filter 函数

var tokens = ["if", "for", "(", ")", "while", "var"]
var test = "if, identifier, for, (, ), while, var1, 3var, ResultVariable, i dentifier";
var lineas = test.components(separatedBy: ", ")

let identifiers = lineas
.filter {!tokens.contains($0)} // Not a token
.filter { // Starts with lowercase letter
guard let first = $0.first else { return false }
return first.isLetter && first.isLowercase
}
.filter { $0.rangeOfCharacter(from: .whitespaces) == nil } // No whitespace

当然,上面的内容可以合并到 filter 的一次调用中,但为了清楚起见,我将其保留为 3 个单独的调用。

关于arrays - 如何从 swift 5 中的正则表达式结果中删除括号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58908369/

47 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com