课题

  1. 使用正则表达式匹配字符串

    使用正则表达式 "\d{3}-(\d{4})-\d{2}" 匹配字符串 "123-4567-89"

    返回匹配结果:’"123-4567-89" 以及 "4567"
  2. 使用正则表达式替换字符串(模式)

    使用正则表达式 "(\d+)-(\d+)-(\d+)" 匹配字符串 "123-4567-89"

    使用模式字符串 "$3-$1-$2" 替换匹配结果,返回结果 "89-123-4567"。
  3. 使用正则表达式替换字符串(回调)

    使用正则表达式 "\d+" 匹配字符串 "123-4567-89"

    将匹配结果即三个数字串全部翻转过来,返回结果 "321-7654-98"。
  4. 使用正则表达式分割字符串

    使用正则表达式 "%(begin|next|end)%" 分割字符串"%begin%hello%next%world%end%"

    返回正则表达式分隔符之间的两个字符串 "hello" 和 "world"。

Swift

import Foundation

let s = "123-4567-89,987-6543-21"
let r = try NSRegularExpression(pattern: #"\d{3}-(\d{4})-\d{2}"#)
let results = r.matches(in: s, options: [], range: NSRange(s.startIndex..., in: s))
for (i, m) in results.enumerated() {
for j in 0..<m.numberOfRanges {
print("group \(i),\(j) : \(String(s[Range(m.range(at: j), in: s)!]))")
}
} let r2 = try NSRegularExpression(pattern: #"(\d+)-(\d+)-(\d+)"#)
let s2 = r2.stringByReplacingMatches(in: s, options: [], range: NSRange(s.startIndex..., in: s), withTemplate: "$3-$1-$2")
print(s2) let r3 = try NSRegularExpression(pattern: #"\d+"#)
let results2 = r3.matches(in: s, options: [], range: NSRange(s.startIndex..., in: s))
var s3 = s
for i in (0..<results2.count).reversed() {
let rng = Range(results2[i].range, in: s3)!
s3.replaceSubrange(rng, with: s3[rng].reversed())
}
print(s3) // https://stackoverflow.com/questions/25818197/how-to-split-a-string-in-swift
extension String { func split(regex pattern: String) -> [String] { guard let re = try? NSRegularExpression(pattern: pattern, options: [])
else { return [] } let nsString = self as NSString // needed for range compatibility
let stop = "<SomeStringThatYouDoNotExpectToOccurInSelf>"
let modifiedString = re.stringByReplacingMatches(
in: self,
options: [],
range: NSRange(location: 0, length: nsString.length),
withTemplate: stop)
return modifiedString.components(separatedBy: stop)
}
} let r4 = "%(begin|next|end)%"
let s4 = "%begin%hello%next%world%end%"
print(s4.split(regex: r4)) /*
group 0,0 : 123-4567-89
group 0,1 : 4567
group 1,0 : 987-6543-21
group 1,1 : 6543
89-123-4567,21-987-6543
321-7654-98,789-3456-12
["", "hello", "world", ""]
*/

使用第三方库

使用标准库解决正则表达式问题过于繁琐

下面使用第三方库 CrossroadRegex

CrossroadRegex - Advanced regular expressions for Swift

import Foundation

let s = "123-4567-89,987-6543-21"
let r = #"\d{3}-(\d{4})-\d{2}"#.r!
r.findAll(in: s).enumerated().forEach { (i, m) in
for j in 0..<m.ranges.count {
print("group \(i),\(j) : \(m.group(at: j)!)")
}
} let r2 = #"(\d+)-(\d+)-(\d+)"#.r!
let s2 = r2.replaceAll(in: s, with: "$3-$1-$2")
print(s2) let r3 = #"\d+"#.r!
let s3 = r3.replaceAll(in: s) { String($0.matched.reversed()) }
print(s3) let r4 = "%(?:begin|next|end)%".r!
let s4 = "%begin%hello%next%world%end%"
print(r4.split(s4)) /*
group 0,0 : 123-4567-89
group 0,1 : 4567
group 1,0 : 987-6543-21
group 1,1 : 6543
89-123-4567,21-987-6543
321-7654-98,789-3456-12
["", "hello", "world", ""]
*/

正则表达式(Swift)的更多相关文章

  1. 工作随笔——UIButton的EdgeInsets + Swift中的正则表达式;

    1.UIButton的EdgeInsets UIButton的EdgeInsets方法,是用来设置title和image对于上左下右四个方向的偏移,但是很奇怪的是,刚开始只有Image,titile也 ...

  2. Swift - 正则表达式的使用(附用户名、邮箱、URL等常用格式验证)

    Swift虽然是一个新出的语言,但却不提供专门的处理正则的语法和类.所以我们只能使用古老的NSRegularExpression类进行正则匹配. 即先接受一个正则表达式的字符串,由此生成NSRegul ...

  3. [Swift]正则表达式工具类

    正则表达式工具类 import Foundation //基于NSRegularExpression api 的正则处理工具类 public struct Regex { private let re ...

  4. swift 3.0 正则表达式查找/替换字符

    1.什么是正则表达式 正则表达式,又称正规表示法.常规表示法(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表达式使用单个字符 ...

  5. swift中的正则表达式

    swift中的t正则表达式 正则表达式是对字符串操作的一种逻辑公式,用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串" ...

  6. swift项目第九天:正则表达式的学习

    import UIKit /* 练习1:匹配abc 练习2:包含一个a~z,后面必须是0~9 -->[a-z][0-9]或者[a-z]\d * [a-z] : a~z * [0-9]/\d : ...

  7. swift 手机号、邮箱、网址等正则表达式验证

    看到一个不错的swift的 手机号.邮箱.网址等正则表达式验证,分享给大家. 支持swift3,经过修改后,亲测可用! import Foundation enum Validate { case e ...

  8. iOS - OC/Swift:验证手机号/固话用正则表达式

    /** * 验证手机号是否正确 * @param unknown_type $mobile */ OC: - (BOOL)isMobileNumber:(NSString *)mobileNum { ...

  9. [Swift]LeetCode10. 正则表达式匹配 | Regular Expression Matching

    Given an input string (s) and a pattern (p), implement regular expression matching with support for  ...

随机推荐

  1. netty初步

    netty是java的高性能socket框架,linux下基epoll,这里不对他多牛逼作分析,网上资料很多,这里针对一般socket的业务作个例子 几个基本概念: channel类似于socket句 ...

  2. php curl_init函数用法(http://blog.sina.com.cn/s/blog_640738130100tsig.html)

    使用PHP的cURL库可以简单和有效地去抓网页.你只需要运行一个脚本,然后分析一下你所抓取的网页,然后就可以以程序的方式得到你想要的数据了.无论是你想从从一个链接上取部分数据,或是取一个XML文件并把 ...

  3. LwIP下一种可能耗尽内存的情况

    若App在连接断开后仍旧使用该tcp_pcb发送数据,LwIP会自动发送SYNC试图重建连接.若对方不响应(指没有任何响应)而App又在不断发送数据,将导致LwIP不停的发送新的SYNC(每试图发送一 ...

  4. 把普通的JavaProject变成MavenProject

    1,安装Maven Eclipse插件 2,在项目上点右键->Configure->Convert to maven project 3,在项目上点右键->Run as->Ru ...

  5. Bootstrap:目录

    ylbtech-Bootstrap:目录 1.返回顶部 1. https://getbootstrap.com/ 2. 2.返回顶部 1. http://www.runoob.com/bootstra ...

  6. 杂项:ORM

    ylbtech-杂项:ORM 对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不 ...

  7. java并发编程 Executor,Executors,ExecutorService,CompletionService,Future,C

    使用CompletionService获取多线程返回值 CompletionService和ExecutorCompletionService详解 Java并发编程系列之十五:Executor框架

  8. [UE4]ue4 FString 中文乱码问题

    使用FString出现乱码,最简单的情况,FString Str = "你好"; 这时候就会出现乱码,解决方法是改成这样 FString Str = TEXT("你好&q ...

  9. Android RIL概述

    前言 Android作为一个通用的移动平台,其首要的功能就是通话.短信以及上网等通信功能.那么,从系统的角度来看,Android究竟是怎么实现与网络的交互的了? 这篇文章里,就来看一看Android中 ...

  10. g++多文件编译

    头文件:A.h void test(); 源文件:A.cpp #include <iostream> #include<thread> #include<chrono&g ...