iOS正则表达式

正则表达式(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>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • 一、什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式。正则表达式可以检测给定的字符串是否...
    Helen_kay阅读 2,755评论 0 2
  • 一、什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式。正则表达式可以检测给定的字符串是否...
    见哥哥长高了阅读 2,007评论 6 48
  • iOS -正则表达式的简单使用 ✨建议收藏,用到时候一查就明白了 下面两个方法我用的也不是很熟练,如果有懂得朋友欢...
    xx_cc阅读 8,558评论 17 177
  • 一. 正则表达式和其他方法的比较 二. 正则表达式的简单使用 2.1 特殊符号^和$。他们的作用是分别指出一个字符...
    iYeso阅读 604评论 0 10
  • 什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式。正则表达式可以检测给定的字符串是否符合...
    Lonely__M阅读 3,046评论 4 48