正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
^
指出一个字符串的开始
$
指出一个字符串的结束
"^iOS"
以iOS开头
"iOS$"
以iOS结尾
"^apple$"
开始和结尾都是apple的字符串,这个是唯一的,实际上就是apple
"apple"
包含apple
*
, +
,?
重复出现的次数。 ?
0~1; +
1~n; *
0~n
"ab*"
一个a后面跟着0~n个b
"ab+"
:一个a后面跟着至少一个b
"ab?"
:一个a后面跟着0~1个b
"a?b+$"
:末尾有01个a跟着1n个b
{}
表示重复的具体范围。
"ab{4}"
一个a跟着4b
"ab{1,}"
一个a跟着至少1个b
"ab{3,5}"
一个a跟着3~5个b
*
可以用{0,}
表示,+
可以用{1,}
表示,?
可以用{0,1}
表示
|
“或”操作:
"a|b"
一个字符串里有a或b
"(a|bcd)ef"
aef或bcdef
"(a|b)+c"
一串a和b混合的字符串后面跟一个c;
[ ]
表示在括号内的众多字符中,选择1-n个括号内的符合语法的字符作为结果
"[ab]"
一个a或b(相当于"a|b"
);
"[a-d]"
a到d中的一个(相当于"a|b|c|d"
或者"[abcd]"
)
"^[a-zA-Z]"
以字母开头
"[0-9]a"
a前有一位的数字
"[a-zA-Z0-9]$"
以一个字母或数字结束
.
任意字符
"a.[a-z]"
a后面跟一个任意字符和一个小写字母
"^.{5}$"
长度为5的字符串
"(.)\1"
两个连续任意字符
"(.)\1{2}"
三个个连续任意字符
在方括号里用^
表示不希望出现的字符,^
应在方括号里的第一位。
"@[^a-zA-Z]@"
表示两个@中不应该出现字母
"\d"
一个数字字符
"\D"
一个非数字字符
"\w "
包括下划线的任何单词字符
"\W"
匹配任何非单词字符
iOS中书写正则表达式,碰到转义字符,多加一个\
正则表达式在IOS开发中的应用
一、根据正则表达式创建NSRegularExpression对象
初始化方法
<pre>
public init(pattern: String, options: NSRegularExpression.Options = []) throws
</pre>
其中,pattern是正则表达式,对于option参数,在oc中它是一个枚举,swift中它是结构体options中的属性
<pre>
public struct Options : OptionSet {
public init(rawValue: UInt)
public static var caseInsensitive: NSRegularExpression.Options { get }
public static var allowCommentsAndWhitespace: NSRegularExpression.Options { get }
public static var ignoreMetacharacters: NSRegularExpression.Options { get }
public static var dotMatchesLineSeparators: NSRegularExpression.Options { get }
public static var anchorsMatchLines: NSRegularExpression.Options { get }
public static var useUnixLineSeparators: NSRegularExpression.Options { get }
public static var useUnicodeWordBoundaries: NSRegularExpression.Options { get }
}
</pre>
<pre>
caseInsensitive //不区分字母大小写
allowCommentsAndWhitespace //忽略掉正则表达式中的空格和#号之后的字符
ignoreMetacharacters //将正则表达式整体作为字符串处理
dotMatchesLineSeparators //允许.匹配任何字符,包括换行符
anchorsMatchLines //允许^和$符号匹配行的开头和结尾
useUnixLineSeparators //设置\n为唯一的行分隔符,否则所有的都有效。
useUnicodeWordBoundaries //使用Unicode TR#29标准作为词的边界,否则所有传统正则表达式的词边界都有效
</pre>
二、执行查询操作
1、以block的形式返回查询结果
<pre>
open func enumerateMatches(in string: String, options: NSRegularExpression.MatchingOptions = [], range: NSRange, using block: (NSTextCheckingResult?, NSRegularExpression.MatchingFlags, UnsafeMutablePointer<ObjCBool>) -> Swift.Void)
</pre>
参数string是待查询的字符串,options的参数如下:
<pre>
public struct MatchingOptions : OptionSet {
public init(rawValue: UInt)
public static var reportProgress: NSRegularExpression.MatchingOptions { get }
public static var reportCompletion: NSRegularExpression.MatchingOptions { get }
public static var anchored: NSRegularExpression.MatchingOptions { get }
public static var withTransparentBounds: NSRegularExpression.MatchingOptions { get }
public static var withoutAnchoringBounds: NSRegularExpression.MatchingOptions { get }
}
</pre>
<pre>
reportProgress //找到最长的匹配字符串后调用block回调
reportCompletion //找到任何一个匹配串后都回调一次block
anchored //从匹配范围的开始出进行极限匹配
withTransparentBounds //允许匹配的范围超出设置的范围
withoutAnchoringBounds //禁止^和$自动匹配行还是和结束
</pre>
参数block回调中,NSTextCheckingResult类型的参数即是查询结果;MatchingFlags类型的参数flags如下:
<pre>
public struct MatchingFlags : OptionSet {
public init(rawValue: UInt)
public static var progress: NSRegularExpression.MatchingFlags { get }
public static var completed: NSRegularExpression.MatchingFlags { get }
public static var hitEnd: NSRegularExpression.MatchingFlags { get }
public static var requiredEnd: NSRegularExpression.MatchingFlags { get }
public static var internalError: NSRegularExpression.MatchingFlags { get }
}
</pre>
<pre>
progress //匹配到最长串时被设置
completed //全部分配完成后被设置
hitEnd //匹配到设置范围的末尾时被设置
requiredEnd //当前匹配到的字符串在匹配范围的末尾时被设置
internalError //由于错误导致的匹配失败时被设置
</pre>
block中还有个类型为UnsafeMutablePointer<ObjCBool>的参数,给它的pointee属性赋值为true,之后便会停止查找
2、查找结果以数组的形式返回
<pre>
open func matches(in string: String, options: NSRegularExpression.MatchingOptions = [], range: NSRange) -> [NSTextCheckingResult]
</pre>
3、返回匹配到的个数
<pre>
open func numberOfMatches(in string: String, options: NSRegularExpression.MatchingOptions = [], range: NSRange) -> Int
</pre>
4、返回匹配到的第一个结果
<pre>
open func firstMatch(in string: String, options: NSRegularExpression.MatchingOptions = [], range: NSRange) -> NSTextCheckingResult?
</pre>
5、返回匹配到的第一个结果的range
<pre>
open func rangeOfFirstMatch(in string: String, options: NSRegularExpression.MatchingOptions = [], range: NSRange) -> NSRange
</pre>
6、将匹配到的结果替换为新的字符串,并将替换后生成的新的字符串返回
<pre>
open func stringByReplacingMatches(in string: String, options: NSRegularExpression.MatchingOptions = [], range: NSRange, withTemplate templ: String) -> String
</pre>
7、将原字符串中匹配到的结果用指定的字符串替换,返回值为Int类型,是匹配并替 换的个数
<pre>
open func replaceMatches(in string: NSMutableString, options: NSRegularExpression.MatchingOptions = [], range: NSRange, withTemplate templ: String) -> Int
</pre>