NativeRegexExamples

正在求职

👋🏼 我叫 Daniel Lyons,是一名 Swift 开发者,目前正在寻找工作。 我希望这个包对您和社区有所帮助。 如果是这样,请考虑查看并与他人分享我的开发者网站dandylyons.github.io。 🙏🏼

目的

NativeRegexExamples 是 Swift 社区可以:

  1. 众包 Regex 解决方案,可在您的项目中使用
  2. 学习 互相学习并开发最佳实践
    • 提供备忘单
  3. 测试 Regexes 用于
    • 匹配项:以便我们可以评估它们的功能
    • 非匹配项:以便我们可以消除误报
    • 替换功能

基本用法

@RegexActor
func foo() {
  let ssnRegex = RegexLiterals.ssn
  let string = "111-11-1111"
  string.contains(ssnRegex) // true
  string.wholeMatch(of: ssnRegex)
  
  var text = """
one SSN -> 111-11-1111
222-22-2222 <- another SSN 
"""
  text.replace(ssnRegex, with: "___")
// text is now:
//  one SSN -> ___
//  ___ <- another SSN
}

不要只是使用库。 看看源代码,这样你就可以从中学习。 每个正则表达式都有一个文字定义和一个 RegexBuilder 定义。 例如

public extension RegexLiterals {
  static let ssn = #/
  # Area number: Can't be 000-199 or 666
  (?!0{3})(?!6{3})[0-8]\d{2}
  -
  # Group number: Can't be 00
  (?!0{2})\d{2}
  -
  # Serial number: Can't be 0000
  (?!0{4})\d{4}
  /#
}

public extension RegexBuilders {
  static let ssn = Regex {
    NegativeLookahead {
      Repeat(count: 3) {
        "0"
      }
    }
    NegativeLookahead {
      Repeat(count: 3) {
        "6"
      }
    }
    ("0"..."8")
    Repeat(count: 2) {
      One(.digit)
    }
    "-"
    NegativeLookahead {
      Repeat(count: 2) {
        "0"
      }
    }
    Repeat(count: 2) {
      One(.digit)
    }
    "-"
    NegativeLookahead {
      Repeat(count: 4) {
        "0"
      }
    }
    Repeat(count: 4) {
      One(.digit)
    }
  }
  .anchorsMatchLineEndings()
}

动机

正则表达式是一种极其强大的工具,能够进行复杂的模式匹配、验证、解析等等。 然而,它可能很难使用,并且它具有非常深奥的语法,很容易搞砸。 每种语言都有自己的 Regex“风格”,而 Swift 在某些重要方面进行了改进:

  1. 严格的编译时类型检查
  2. Regex 字面量语法高亮显示
  3. 通过 RegexBuilder 的可选的、更易读的 DSL

但是,许多关于正则表达式的 Swift 资源都是关于较旧的技术,例如 NSRegularExpressions 或第三方 Swifty 库。 虽然这些技术和资源很棒,但它们并没有给我们机会学习和解锁原生 Swift Regex 的新功能。

Regex 也是一项存在了几十年的技术。 这意味着许多问题很久以前就已经在正则表达式中得到了解决。 更好的是,Swift Regex 字面量经过精心设计,可以与许多其他语言风格的正则表达式兼容,包括 Perl、Python、Ruby 和 Java。 我们不妨从其他社区的经验中学习!

贡献

非常感谢为 Swift 社区的利益所做的贡献。 请随时提交 PR 或 Issue!

所有数据类型都应该添加测试。 测试完全通过新的 Swift Testing 框架完成。 这应确保该库将来可在非 Xcode、非 Apple 平台上使用/测试。

抱歉,Swift Testing 仅适用于 Swift 6 及更高版本。 虽然,我看不出我们为什么不能将该库向后部署到 5.7 及更高版本。

推荐资源

我强烈建议使用 swiftregex.com,由 SwiftFiddle 提供。 这是一个强大的在线游乐场,用于测试 Swift Regexes。 它最好的功能之一是它可以来回转换传统正则表达式模式和 Swift 的 RegexBuilder DSL。

灵感

注意事项

严格的并发检查

Swift Regex 类型不是 Sendable。 显然,这是因为 Regex 允许用户连接他们自己的自定义逻辑,因此 Swift 无法保证数据竞争安全。 因此,我已将库中的所有 Regex 都隔离到 @RegexActor(库中定义的最小全局 actor)。 如果我能找到更好的解决方案,我将删除此 actor 隔离。 如果您直接在代码中使用库中的任何正则表达式,您很可能需要隔离到 @RegexActor。 也就是说,您应该能够将库中的任何正则表达式复制并粘贴到您自己的代码中,然后您将不再受 @RegexActor 的限制。

推荐资源

Swift Regex

Swift Testing

安装

将 NativeRegexExamples 作为包依赖项添加到项目的 Package.swift 中

// swift-tools-version:6.0
import PackageDescription

let package = Package(
    name: "MyPackage",
    dependencies: [
        .package(
            url: "https://github.com/DandyLyons/NativeRegexExamples",
            .upToNextMinor(from: "0.0.1")
        )
    ],
    targets: [
        .target(
            name: "MyTarget",
            dependencies: [
                .product(name: "NativeRegexExamples", package: "NativeRegexExamples")
            ]
        )
    ]
)

项目状态

该项目处于早期开发阶段。 当前目标

非常欢迎您的贡献!

致谢

Star History

Star History Chart

许可证

该项目根据 MIT 许可证获得许可。 有关详细信息,请参阅LICENSE 文件