文档章节

正则表达式简单语法总结

l
 linweida
发布于 2016/09/28 00:05
字数 2491
阅读 26
收藏 3

正则表达式简单语法总结

一、什么是正则表达式:从概念上来说,正则表达式也是一门小巧而精炼的语言,它可以用来简化检索特定的字符串,替换特定字符等功能,有许多开发语言工具,都内嵌支持正则表达式。那么一个正则表达式,究竟是什么?其实它就是一个字符串,但这个字符串具有特定含义。

二、正则表达式的基础语法

1、字面值:所谓字面值,就是没有任何转义,查找的对象就是其本身,比如正则表达式 abc ,查找的结果就是返回要查找字符串中 a,b,c三个字母连在一起的字符串。又如,123 就是查找到123这个子串。

2、特殊字符(元字符)
(1)句号:“.”在正则表达式中表示匹配任意字符,很相似于通配符*。如果我们查找a.b这个正则表达式,我们可以找到所有开头和结尾为a,b,中间是任意字符的字符串,比如abc,adc,a2c等。
(2)字符类([]):如果你在一个正则表达式中看到有一些字符被[]括号括起来,那么他们的含义将不再是简单的字面值,他们表示某一个被括号中属性约束的字符。比如[123456],这个正则表达式表示找到1-6中的任意一个字符,又比如a[bd]c,这表示查找abc或者adc。

注意:

1.在字符类中字符的顺序和重复性都不是我们关心的。[123]和[2233111],含义是一模一样的。

2.句号在字符类中表示的就是其本身,[.]就是查找一个句号。

(3)区间符号(-)

如果我们需要查找一个数字,[0123456789],这样做是可以达到目的的,但这写起非常麻烦,并不符合正则表达式小巧的特性,这时我们可以使用区间符号来简化,[0-9]和上面的式子意义完全一样。同样,我们可以[a-zA-Z],表示任意一个字母。

注意:

1.区间的范围应该有意义,[a-1]这样的区间并无任何意义,尽管它在语法上可能没有错误。

2.区间左右两端对应的是字符,并不是数字,比如[2-41],这个式子的含义是找到2-4的一个数字或者1,和[1-4]是一样的。
(4)取反符号(^)

“^”在正则表达式中表示取反,这个很好理解,[^a],表示找到除了a之外的任意字符。[^0-9],表示找到一个非数字的字符。

注意:

1.^必须在中括号内,及字符类属性中使用。

2.^是将后面的整体作为取反条件的。
(5)简化的字符类

某些符号具有和字符类相同的含义:

\d和[0-9]相同

\w和[0-9A-Za-z_]相同 表示数字,字母或者下划线

\s表示匹配空格,tab和换行等不可见符。

与此相对的\D,\W,\S,则表示上述条件的取反情况。
(6)乘法集({})

乘法集的最大用处也是简化正则表达式,用大括号表示。比如,a{2},表示找到aa这个字符串。

注意:

乘法集是已前面整体为乘法条件的,比如[ab]{2},不是简单的比配aa,bb,而是和[ab][ab]含义是相同的,会匹配ab,ba,aa,bb。
(7)乘法集中的区间(,)

乘法集和字符类相同,也可以用区间进行简化,但是符号不相同。a{1,3},表示找到a,aa,aaa这三个字符串。a{0,1}是合法的,表示找到空字符,或者a。

注意:

1.乘法集的"越长越好"属性:乘法集具有这样的特点,比如a{2,4},如果我搜索myaaaa,它不会找到aa后就停止,而是会找到aaaa。

2.乘法集的"全部获取"属性:比如a{2.4},如果搜索myaayouaaaa,它会找到aa和aaaa。

3.乘法集支持开区间,a{1,}是合法的,表示找到任何a相连的字符串。
(8)判断符号(?)

这个符号的含义和{0,1}完全相同,123?4,表示匹配1234或者124;
(9)统配符号(*)

这个符号的含义和{0,}相同,比如.* 表示通配一切字符串。
(10)+符号

这个符号和{1,}相同。
(11)或符号(|)

“|”符号表示或的关系,比如abc|edf,表示找到abc或者def
(12)组合(())

小括号在正则表达式中表示组合,比如(a|b|c)d,表示找到ad,bd,cd,可以将小括号的作用理解为优先级。
(13)单词边界(\b)

\b表示单词的边界,比如\b[a-z]{3}\b,表示匹配一个三个字母的小写单词。
(14)行边界(^ $)

单单的一个^符号表示的是行的开头,$表示行的结束。

注意:

[^]是非法的,[$]表示匹配一个$符号。
三、做些小总结

上面说了这么多正则表达式的语法规则,我们现在来做下总结:
1、几个概念:

1、字面值:直接查找的字符,比如123,avb。

2、字符类:描述字符的一些属性,比如[123],[a-z],\d,\w,\s,.。

3、乘法集:简化表达式,比如{0,3},?,+,*。

4、或和组合:比如(a|b|v)。

5、单词,行的边界\b ^ $
2、元字符列表

. \ [ ] { }  ? * + | ( ) ^ $
3、字符类中元字符列表

[ ] \ - ^
四、一个特别重要的字符

最后,还有一个特别特别重要的字符我们没考虑到,如果我们要查找元字符怎么办,在正则表达式中还有一个转义字符"\",如果我们要查找. 只要查找\. 同理\[\]是查找"[]"这个字符串。如果要查找"\",再加一个转义字符就好:\\。


正则表达式在IOS开发中的应用

一、初始化方法

初始化NSRegularExpression的方法有两种,一个init方法和一个类方法。其作用基本是一样的

+ (NSRegularExpression *)regularExpressionWithPattern:(NSString *)pattern options:(NSRegularExpressionOptions)options error:(NSError **)error;

- (instancetype)initWithPattern:(NSString *)pattern options:(NSRegularExpressionOptions)options error:(NSError **)error


其中,pattern是正则表达式,options是参数。对于option参数,它是一个枚举,表示正则模式的设置,如下:

typedef NS_OPTIONS(NSUInteger, NSRegularExpressionOptions) {
    NSRegularExpressionCaseInsensitive             = 1 << 0, //不区分字母大小写的模式
    NSRegularExpressionAllowCommentsAndWhitespace  = 1 << 1, //忽略掉正则表达式中的空格和#号之后的字符
    NSRegularExpressionIgnoreMetacharacters        = 1 << 2, //将正则表达式整体作为字符串处理
    NSRegularExpressionDotMatchesLineSeparators    = 1 << 3, //允许.匹配任何字符,包括换行符
    NSRegularExpressionAnchorsMatchLines           = 1 << 4, //允许^和$符号匹配行的开头和结尾
    NSRegularExpressionUseUnixLineSeparators       = 1 << 5, //设置\n为唯一的行分隔符,否则所有的都有效。
    NSRegularExpressionUseUnicodeWordBoundaries    = 1 << 6 //使用Unicode TR#29标准作为词的边界,否则所有传统正则表达式的词边界都有效
};

注意:
(1) NSRegularExpressionCaseInsensitive模式下正则表达式 aBc 会匹配到abc.
(2) NSRegularExpressionIgnoreMetacharacters模式下正则表达式a b c 会匹配到abc,正则表达式ab#c会匹配到ab。
(3) NSRegularExpressionAllowCommentsAndWhitespace模式下正则表达式[a-z],会匹配到[a-z]。

二、获取查询结果

初始化完毕正则表达式的处理类后,我们需要进行正则表达式的查询,IOS官方提供了两种模式:

1、带block模式的方法:
- (void)enumerateMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range usingBlock:(void (^)(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop))block;

使用举例:
NSRegularExpression * regex = [[NSRegularExpression alloc]initWithPattern:@"[a-z]" options:NSRegularExpressionCaseInsensitive error:nil];
[regex enumerateMatchesInString:@"124a" options:NSMatchingReportProgress range:NSMakeRange(0, 4) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
    NSLog(@"%@",result);
} ];

注意:

(1) 这个函数的一个参数options是一个枚举,设置回调的方式,如下:
typedef NS_OPTIONS(NSUInteger, NSMatchingOptions) {
    NSMatchingReportProgress         = 1 << 0, //找到最长的匹配字符串后调用block回调
    NSMatchingReportCompletion       = 1 << 1, //找到任何一个匹配串后都回调一次block
    NSMatchingAnchored               = 1 << 2, //从匹配范围的开始出进行极限匹配
    NSMatchingWithTransparentBounds  = 1 << 3, //允许匹配的范围超出设置的范围
    NSMatchingWithoutAnchoringBounds = 1 << 4  //禁止^和$自动匹配行还是和结束
};

(2) block回调中的flags枚举对应如下:
typedef NS_OPTIONS(NSUInteger, NSMatchingFlags) {
    NSMatchingProgress               = 1 << 0, //匹配到最长串是被设置
    NSMatchingCompleted              = 1 << 1, //全部分配完成后被设置
    NSMatchingHitEnd                 = 1 << 2, //匹配到设置范围的末尾时被设置
    NSMatchingRequiredEnd            = 1 << 3, //当前匹配到的字符串在匹配范围的末尾时被设置
    NSMatchingInternalError          = 1 << 4  //由于错误导致的匹配失败时被设置
};

(3) 还有一点需要注意,就是那个bool值stop,我们可以在block块中设置它为YES,之后便会停止查找。

2、非block的方法

// 这个方法会返回一个结果数组,将所有匹配的结果返回
- (NSArray *)matchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;


// 这个方法会返回匹配到得字符串的个数
- (NSUInteger)numberOfMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;


// 这个方法会返回第一个查询到得结果,这个NSTextCheckingResult对象中有一个range属性,可以得到匹配到的字符串的范围。
- (NSTextCheckingResult *)firstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;


// 这个方法直接返回匹配到得范围,NSRange。
- (NSRange)rangeOfFirstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;


三、一个辅助方法

// 在NSRegularExpression类中还提供了一个辅助方法:
+ (NSString *)escapedPatternForString:(NSString *)string;
// 它可以帮助我们将正则表达式加上"\"进行保护,将元字符转化成字面值。

 


TEST_正则表达式
正则表达式中"."表示的意思
正则表达式中ab[456]d表示的意思
正则表达式中[...]表示的意思
正则表达式中表示任意一个英文字母
正则表达式中[1-523]表示的意思
正则表达式中表示一个非数字的字符的意思
正则表达式中 \d、\w、\s、\D、\W、\S 表示的意思
正则表达式中[ab]{3}表示的意思

 

 

© 著作权归作者所有

共有 人打赏支持
l
粉丝 1
博文 35
码字总数 98066
作品 0
广州
Java魔法堂:深入正则表达式API

目录                               一、前言 二、正则表达式的使用诉求 三、java.util.regex包 四、java.lang.String实例 五、最短路径实现诉求 六、Java支...

fsjohnhuang
2014/11/16
0
0
Python正则表达式指南(上)

正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十...

开心303
2011/07/28
0
0
Python3网络爬虫——(5)正则表达式(re模块)

一、正则表达式 1、正则表达式是字符串搜索引擎 Python正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些字符的组合,组成一个“规则字符串”,这个“规则字...

飞天小橘子
04/04
0
0
前端计划——JavaScript正则表达式快速入门

前言:正则表达式时处理字符串中常用的手法,本文以简单的方式,快速展示了JavaScript中正则相关的基础知识点。文末还提供了几个简单的正则相关面试题。个人总结,如有错误,还望指正, Java...

Alarak
2017/06/13
0
0
可能是最好的正则表达式的教程笔记了吧...

笔记是由油管的@The Coding Train老师发布系列教程。 因为正则我自己看了很多次,但是很快又忘记。所以为了彻底搞懂,一边学习一边记笔记,以给别人讲课的方式记笔记,我自己的印象会更深,所...

Vincent Ko
07/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周三乱弹 —— 我们无法成为野兽

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ _刚刚好: 霸王洗发水这波很骚 手机党少年们想听歌,请使劲儿戳(这里) hahahahahahh @嘻酱:居然忘了喝水。 让你喝可乐的话, 你准忘不了...

小小编辑
44分钟前
1
0
vm GC 日志 配置及查看

-XX:+PrintGCDetails 打印 gc 日志 -XX:+PrintTenuringDistribution 监控晋升分布 -XX:+PrintGCTimeStamps 包含时间戳 -XX:+printGCDateStamps 包含时间 -Xloggc:<filename> 可以将数据保存为......

Canaan_
昨天
0
0
学习设计模式——生成器模式

1. 认识生成器模式 1. 定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 2. 组成: Builder:生成器接口,定义创建一个Product对象所需要的各个组件的操作,...

江左煤郎
昨天
0
0
C语言精要(第二章:基本数据类型)

2.1 C语言基本数据类型 在计算机术语中,把⼆进制数中的某⼀位数又称为⼀个⽐特(bit)。⽐特这个单位对于计算机⽽⾔,在度量上是最⼩的单位。除了⽐特之外,还有字节(byte)这个术语。⼀个...

ryanliue
昨天
0
0
实现下拉菜单多选框效果

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><li>工作意愿地:<%-- <c:forEach items="${list}" var="list"><input type="checkbox" value="${list......

lanjian28
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部