【发布时间】:2017-07-07 19:29:23
【问题描述】:
我一直在尝试使用 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"
记住:
- 所有这些正则表达式都必须包含在双引号内才能创建将用作模式的字符串文字。
- 我正在使用 String 的
range方法和.regularExpression选项来匹配内容。 - 我将 Swift 4 与 Xcode 9 Playground 一起使用
如何在 Swift 中转义双引号以成功匹配字符串中的双引号?
解决方案
感谢@Atlas_Gondal 和@vadian,我注意到问题“部分”不是正则表达式,而是我得到的字符串使用了不同类型的双引号“ ... ”,所以我必须将我的模式更改为喜欢这个"(?<=“).*(?=”)" 以便使用它。
生成的代码如下所示:
func extractText(sentence: String?) -> String {
let pattern = "(?<=“).*(?=”)"
let source = sentence!
if let range = source.range(of: pattern, options: .regularExpression) {
return "\(source[range])"
}
return ""
}
【问题讨论】:
-
在开场报价前有可能转义。这个
(?<!\\")阻止它匹配。所以,现在总共是(?<!\\")(?<=") -
顺便说一句,所有正则表达式引擎都将
(?<=\")解释为(?<="),所以如果它现在不工作,那就是语言解析字符串时的问题。 -
现在提取整个字符串中的单引号单词。如果字符串有多个带引号的单词,则它不起作用。有什么帮助吗?