regex - 在 Swift 中使用正则表达式定位双引号

标签 regex swift

我一直在尝试使用 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/

相关文章:

regex - 如何从 Lumen 路由器中的 "/api"-route 中排除 "any"(每个正则表达式)?

来自文件的 Python 正则表达式表创建器

ios - Alamofire fire 变量类型没有下标成员

ios - 由 UIDocumentInteractionController (iOS 10.3) 打开时出现空白或半加载的 PDF

objective-c - 使用 firebase for iOS 的 leveldb-library.framework 和 Xcode9

用于检测网站上复杂攻击字符串的正则表达式

ruby-on-rails - 什么是类似 Twitter 名称的正则表达式?

python - 正则表达式在单个匹配中查找并打印多个匹配

ios - 是否可以通过 iDevice 闪电端口访问数据?

ios - 单击 View 时出现导航栏