by Crossroad Labs

Regex

🐧 linux: ready GitHub license Build Status GitHub release Carthage compatible CocoaPods version Platform OS X | iOS | tvOS | watchOS | Linux

Swift 的高级正则表达式

目标

Regex 库最初是为了满足 Swift Express 的需求而引入的,Swift Express 是用于 Swift 的 Web 应用程序服务器端框架。

我们仍然希望它对其他人也有用。

祝你正则表达式愉快 ;)

特性

额外

Path to Regex 转换器可在此处作为单独的库使用:PathToRegex

它允许使用诸如 /folder/*/:file.txt/route/:one/:two 之类的路径模式转换为正则表达式并与字符串进行匹配。

开始使用

安装

包管理器

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

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

运行 swift build 并构建您的应用程序。

CocoaPods

将以下内容添加到您的 Podfile

pod 'CrossroadRegex'

确保您正在使用框架集成您的依赖项:将 use_frameworks! 添加到您的 Podfile。 然后运行 pod install

Carthage

将以下内容添加到您的 Cartfile

github "crossroadlabs/Regex"

运行 carthage update 并按照 Carthage 的 README 中描述的步骤操作。

手动

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

例子

Hello Regex

以下所有行都是相同的,并表示简单的匹配。 所有运算符和 matches 函数都返回 Bool

//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 关键字)

Regex 提供了与 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", "."]

更新日志

您可以将 更新日志 作为单独的文档 在此处 查看。

贡献

要开始,请签署贡献者许可协议

Crossroad Labs by Crossroad Labs