我一直在尝试使用Swift中的正则表达式从字符串中提取文本。我想要提取的文本位于双引号内,因此我正在尝试定位那些双引号并获取其中的文本。这是我正在使用的正则表达式:
当我尝试在Swift中使用这个正则表达式时,我必须转义其中的双引号,但由于某种原因,正则表达式不能使用转义后的双引号,例如
代码示例:
(?<=")(?:\\.|[^"\\])*(?=")
,它可以很好地处理任何类型的文本,甚至可以更简单,因为我正在寻找那些可能在双引号内的任何东西。当我尝试在Swift中使用这个正则表达式时,我必须转义其中的双引号,但由于某种原因,正则表达式不能使用转义后的双引号,例如
(?<=\")(?:\\.|[^\"\\])*(?=\")
。即使我尝试使用像\"
这样简单的内容,正则表达式也无法匹配字符串中的任何一个双引号。代码示例:
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的帮助,我注意到问题“部分”不是RegExp,而是我得到的字符串使用不同类型的双引号“ ... ”
,所以我必须更改我的模式为"(?<=“).*(?=”)"
才能使用它。
结果代码如下:
func extractText(sentence: String?) -> String {
let pattern = "(?<=“).*(?=”)"
let source = sentence!
if let range = source.range(of: pattern, options: .regularExpression) {
return "\(source[range])"
}
return ""
}
(?<!\\")
可以防止匹配。因此,总的来说,现在应该是(?<!\\")(?<=")
。 - user557597(?<=\")
解释为(?<=")
,所以如果它现在无法工作,那么可能是语言解析字符串时出了问题。 - user557597