regex Swift正则表达式,带变量(非固定)String子组件

zysjyyx4  于 2023-08-08  发布在  Swift
关注(0)|答案(1)|浏览(113)

是否有可能创建一个可重用的Swift 5.8+ Regex模式与一个可变的(非固定的)组件?如果是,怎么做?
从概念上讲,请考虑将关键字变量用作正则表达式的一部分的用例。这类似于String类型中的插值。

func example(keyword: String) {
    // non-functional concept shorthand
    var regex = /…\(keyword)…/
    // do something with regex 
}

字符串
很可能/…/正则表达式没有支持这种方法的语法。而且,\(…)String插值语法和regex (…)捕获语法的相似性可能存在问题。

  • 更确切地说,是否可以以某种方式使用几种较新的(非NSRegularExpression)正则表达式定义方法中的任何一种来支持变量String子组件?*
b09cbbtk

b09cbbtk1#

RegexBuilder提供了一种方便的方法来构建它。举例来说:

import RegexBuilder

let string = "prefixandthissuffix"

func example(keyword: String) {
    // non-functional concept shorthand
    var regex = Regex {
        "prefix"
        keyword
        "suffix"
    }

    if let match = string.wholeMatch(of: regex) {
        print(match.output)
    } else {
        print("\(keyword): nomatch")
    }
}

example(keyword: "andthis")  // prints match
example(keyword: "andthat")  // nomatch

字符串
请注意,每次需要更改关键字字符串时,都需要重新生成Regex。可以将动态重建封装在函数中。

func quotedRegex(keyword: String) -> Regex<Substring> {
    let regex = Regex {
        /"/
        keyword
        /"/
    }
    return regex
}

let string = "{\"key1\":\"value\"}"
for word in ["key1", "KEY1", "key2"] {
    var regex = quotedRegex(keyword: word)
    regex = regex.ignoresCase() // transformed
    if let match = string.firstMatch(of: regex) {
        print("\(word) matched \(match.output)")
    } else {
        print("\(word) not matched")
    }
}

// print:
//   key1 matched "key1"
//   KEY1 matched "key1"
//   key2 not matched

相关问题