我一直在尝试使用 Swift 中的正则表达式在字符串中提取一段文本。我要提取的文本在双引号内,因此我试图以这些双引号为目标并在其中获取一段文本。
这是我正在使用的正则表达式:(?<=")(?:\\.|[^"\\])*(?=")
它适用于任何类型的文本,而且它可以更简单,因为我正在寻找任何可能包含在双引号内的内容。
当我尝试将此 RegExp 与 Swift 一起使用时,我必须将其中的双引号转义,但出于某种原因,RegExp 不适用于转义双引号,例如(?<=\")(?:\\.|[^\"\\])*(?=\")
.
即使我尝试一些像这样简单的 \"
RegExp 不匹配字符串中的任何双引号。
代码示例
func extractText(sentence: String?) -> String {
let pattern = "(?<=\")(?:\\.|[^\"\\])*(?=\")"
let source = sentence!
if let range = source.range(of: pattern, options: .regularExpression) {
return "Text: \(source[range])"
}
return ""
}
extractText("Hello \"this is\" a test") -> "this is"
要牢记:
- 所有这些 RegExp 都必须放在双引号内,以创建将用作模式的字符串文字。
- 我正在使用字符串的
range
方法与.regularExpression
匹配内容的选项。 - 我在 Xcode 9 Playground 上使用 Swift 4
如何在 Swift 中对双引号进行转义以成功匹配字符串中的双引号?
解决方案
感谢@Atlas_Gondal 和@vadian 我注意到“部分”问题不是 RegExp,而是我得到的字符串使用了不同类型的双引号 “ ... ”
所以我必须将我的模式更改为这样的 "(?<=“).*(?=”)"
为了使用它。
结果代码如下所示:
func extractText(sentence: String?) -> String {
let pattern = "(?<=“).*(?=”)"
let source = sentence!
if let range = source.range(of: pattern, options: .regularExpression) {
return "\(source[range])"
}
return ""
}
最佳答案
range(of
with regularExpression
选项无法做到这一点,因为它无法捕获组。
你需要真实的 NSRegularExpression
func extractText(sentence: String) -> String {
let pattern = "\"([^\"]+)\""
let regex = try! NSRegularExpression(pattern: pattern)
if let match = regex.firstMatch(in: sentence, range: NSRange(sentence.startIndex..., in: sentence)) {
let range = Range(match.range(at: 1), in: sentence)!
return String(sentence[range])
}
return ""
}
extractText(sentence:"Hello \"this is\" a test")
模式要简单得多:搜索双引号后跟一个或多个非双引号字符后跟右双引号。捕获双引号之间的字符。
请注意,文字字符串中的转义双引号只是虚拟转义。
PS:如果没有 Swift 3 或 4 中的参数标签,您的代码将无法编译。
关于regex - 在 Swift 中使用正则表达式定位双引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44978393/