CrossroadRegex 1.1.0

CrossroadRegex 1.1.0

测试已测试
语言语言 SwiftSwift
许可证 Apache 2
发布最新发布2017年12月
SwiftSwift 版本4.0
SPM支持 SPM

Daniel Leping 维护。



by Crossroad Labs

正则表达式

![GitHub license](https://img.shields.io/badge/license-Apache%202.0-lightgrey.svg)

Swift 高级正则表达式

目标

Regex 库主要引入是为了满足 Swift Express 的需求 - 一个为 Swift 服务的 Web 应用服务器端框架。

但我们仍然希望它对每个人都是有用的。

享受编写正则表达式吧 ;)

特性

  • [x] 深度集成 Swift
    • [x] 支持 =~ 操作符
    • [x] 支持 Swift 模式匹配(即 switch 操作符)
  • [x] 命名组
  • [x] 匹配检查
  • [x] 提取/搜索函数
  • [x] 替换函数
    • [x] 使用模式
    • [x] 使用自定义替换函数
  • [x] 使用正则表达式进行分割
    • [x] 简单
    • [x] 使用组
  • [x] 字符串扩展

额外

Regex 转化器路径作为单独的库在这里可用: PathToRegex

这个允许使用路径模式如 /folder/*/:file.txt/route/:one/:two 来转换为正则表达式,并匹配字符串。

入门

安装

包管理器

将以下依赖项添加到您的 Package.swift

.Package(url: "https://github.com/crossroadlabs/Regex.git", majorVersion: 0)

运行 swift build 并构建您的应用程序。包管理器支持 OS X,但建议仅在 Linux 上使用。

手动操作

  1. /Regex 文件夹下载并拖放到您的项目中。
  2. 恭喜您!

示例

你好 Regex

下面的所有行都相同,代表简单的匹配。所有操作符和 matches 函数返回布尔值

//operator way, can match either regex or string containing pattern
"l321321alala" =~ "(.+?)([123]*)(.*)".r
"l321321alala" =~ "(.+?)([123]*)(.*)"

//similar function
"(.+?)([123]*)(.*)".r!.matches("l321321alala")

操作符 !~ 如果表达式未匹配则返回 true

"l321321alala" !~ "(.+?)([123]*)(.*)".r
"l321321alala" !~ "(.+?)([123]*)(.*)"
//both return false

Swift 模式匹配(即 switch 关键字)

正则表达式与 Swift 深度集成,并且可以通过以下方式与 switch 关键字一起使用

let letter = "a"
let digit = "1"
let other = "!"

//you just put your string is a regular Swift's switch to match to regular expressions
switch letter {
    //note .r after the string literal of the pattern
  case "\\d".r: print("digit")
    case "[a-z]".r: print("letter")
    default: print("bizarre symbol")
}

switch digit {
    case "\\d".r: print("digit")
    case "[a-z]".r: print("letter")
    default: print("bizarre symbol")
}

switch other {
    //note .r after the string literal of the pattern
  case "\\d".r: print("digit")
    case "[a-z]".r: print("letter")
    default: print("bizarre symbol")
}

上述代码的输出将如下所示

letter
digit
bizarre symbol

访问组

// strings can be converted to regex in Scala style .r property of a string
let digits = "(.+?)([123]*)(.*)".r?.findFirst(in: "l321321alala")?.group(at: 2)
// digits is "321321" here

命名组

let regex:RegexType = try Regex(pattern:"(.+?)([123]*)(.*)",
                                        groupNames:"letter", "digits", "rest")
let match = regex.findFirst(in: "l321321alala")
if let match = match {
    let letter = match.group(named: "letter")
    let digits = match.group(named: "digits")
    let rest = match.group(named: "rest")
    //do something with extracted data
}

替换

let replaced = "(.+?)([123]*)(.*)".r?.replaceAll(in: "l321321alala", with: "$1-$2-$3")
//replaced is "l-321321-alala"

使用自定义替换函数替换

let replaced = "(.+?)([123]+)(.+?)".r?.replaceAll(in: "l321321la321a") { match in
    if match.group(at: 1) == "l" {
        return nil
    } else {
        return match.matched.uppercaseString
    }
}
//replaced is "l321321lA321A"

分割

在下面的示例中,split() 查找 0 个或多个空格,后跟一个分号,再跟 0 个或多个空格,发现后从字符串中删除这些空格。nameList 是 split() 返回的结果数组。

let names = "Harry Trump ;Fred Barney; Helen Rigby ; Bill Abel ;Chris Hand"
let nameList = names.split(using: "\\s*;\\s*".r)
//name list contains ["Harry Trump", "Fred Barney", "Helen Rigby", "Bill Abel", "Chris Hand"]

分组分割

如果分隔符包含捕获括号,则将匹配结果返回到数组中。

let myString = "Hello 1 word. Sentence number 2."
let splits = myString.split(using: "(\\d)".r)
//splits contains ["Hello ", "1", " word. Sentence number ", "2", "."]

路线图

  • v1.0:稳定版本(一旦我们确认没有问题出现)

更新日志

您可以在以下位置查看CHANGELOG 作为单独的文档此处

贡献

要开始,请签署捐赠者许可协议

Crossroad Labs 由Crossroad Labs