所以我在设置正确的正则表达式以查找文件中的特定字符串集时遇到了一些问题。我想要做的就是我们有一个文件,里面填充了一堆在不同平台上使用的函数。问题是有许多重复和/或替代可以被吹走,但我想解析所有其他功能,只关注这一组。下面是我试图在文件中找到的函数示例(没有确切的函数,只是一个简单的例子)
searchForKey(key: "some_key_name", defaultValue: "Random message")
searchForKey(key: "other_key", defaultValue: "A long message here")
所以我找到了一个可以构建正则表达式的网站,但它看起来像PHP,因为当我在swift中尝试时它不起作用。这就是它的样子,但正如我所说,我一直在寻找一场比赛失败。
let pattern = "searchForKey(key:.*, defaultValue:.*)"
let result = testKey.range(of: pattern, options: .regularExpression) == nil
答案 0 :(得分:0)
首先应该知道的是,(
或)
等特殊字符需要以正则表达式模式进行转义。正则表达式转义字符\
在Swift String中变为\\
。 (即使在PHP中也需要转义。)
let text = """
searchForKey(key: "some_key_name", defaultValue: "Random message")
searchForKey(key: "other_key", defaultValue: "A long message here")
"""
let pattern = "searchForKey\\(key:.*, defaultValue:.*\\)"
if let range = text.range(of: pattern, options: .regularExpression) {
print("Found:", text[range])
} else {
print("Not Found")
}
//-> Found: searchForKey(key: "some_key_name", defaultValue: "Random message")
但最好使用*?
而不是简单的*
。有时,简单的.*
可能比您预期的更长:
let text2 = """
searchForKey(key: "some_key_name", defaultValue: "Random message");searchForKey(key: "other_key", defaultValue: "A long message here")
"""
if let range = text2.range(of: pattern, options: .regularExpression) {
print("Found:", text2[range])
} else {
print("Not Found")
}
//-> Found: searchForKey(key: "some_key_name", defaultValue: "Random message");searchForKey(key: "other_key", defaultValue: "A long message here")
let pattern2 = "searchForKey\\(key:.*?, defaultValue:.*?\\)"
if let range = text2.range(of: pattern2, options: .regularExpression) {
print("Found:", text2[range])
} else {
print("Not Found")
}
//-> Found: searchForKey(key: "some_key_name", defaultValue: "Random message")