关于正则表达式,相信你们并不陌生,可能平时只是粘贴下相关代码,并不了解里面所写匹配规则。这篇文章咱们将介绍iOS相关正则表达式基本语法和一些实例,但愿看完此文你们能有所收获;html
在线匹配工具java
安装包git
图形化展现工具github
eg:正则表达式
库objective-c
正则表达式(又称规则表达式),英语为Regular Expression
,常简写为regex
、regexp
或RE
。它使用单个字符串来描述,匹配一系列符合某个句法规则的字符串。express
使用场景:bash
eg:网络
Xcode使用场景编辑器
正则表达式是由普通字符和特殊字符(也叫元字符或限定符)组成的文字模板,为用来描述或匹配符合某个句法规则的字符串。在许多软件中都获得普遍的应用,固然针对不一样的命令及环境,对正则表达式的支持程度也不尽相同,这里参考正则表达式 - 应用领域。有一个通识问题说明一下:
"/"是JS中常常用来分隔一个正则的开始与结尾的字符,其余语言中不用作此区分;
好比:
/* JS */
/abc/ //精确匹配abc(有/符号)
/* 其余语言 */
abc //精确匹配abc(无/符号)
复制代码
不少人刚开始无从下手多是由于不清楚如何"断句",这样也就抓不住重点,感受像听天书了。🤔咱们能够这样拆开来看,把正则表达式当作是普通字符和其余字符的集合。普通字符包括全部大写和小写字母、全部数字、全部标点符号和一些其余符号(PS:就是平时看得懂的符号🙄);其余字符包括了常说的元字符、运算符、限定符、特殊字符等等;
下面是一个匹配以数字开头,并以 abc 结尾的字符串;
^ [0-9] + abc $
定位符 字符集 限定符 普通字符 限定符
复制代码
各类字符的详细解释可参照正则表达式 - 语法。以后稍微了解一点语法,就能够尝试本身断句了,为了少走弯路,建议参照图形化展现工具regulex对比理解。
语法篇主要参照learn-regex的划分;你们能够参照做者的在线练习进行学习,下面👇仅附上主要元字符对照表。
正则表达式主要依赖于元字符. 元字符不表明他们自己的字面意思, 他们都有特殊的含义. 一些元字符写在方括号中的时候有一些特殊的意思. 如下是一些元字符的介绍:
元字符 | 描述 |
---|---|
. | 句号匹配任意单个字符除了换行符. |
[ ] | 字符种类. 匹配方括号内的任意字符. |
[^ ] | 否认的字符种类. 匹配除了方括号里的任意字符 |
* | 匹配>=0个重复的在*号以前的字符. |
+ | 匹配>=1个重复的+号前的字符. |
? | 标记?以前的字符为可选. |
{n,m} | 匹配num个大括号以前的字符 (n <= num <= m). |
(xyz) | 字符集, 匹配与 xyz 彻底相等的字符串. |
| | 或运算符,匹配符号前或后的字符. |
\ | 转义字符,用于匹配一些保留的字符 [ ] ( ) { } . * + ? ^ $ \ | |
^ | 从开始行开始匹配. |
$ | 从末端开始匹配. |
正则表达式提供一些经常使用的字符集简写. 以下:
简写 | 描述 |
---|---|
. | 除换行符外的全部字符 |
\w | 匹配全部字母数字, 等同于 [a-zA-Z0-9_] |
\W | 匹配全部非字母数字, 即符号, 等同于: [^\w] |
\d | 匹配数字: [0-9] |
\D | 匹配非数字: [^\d] |
\s | 匹配全部空格字符, 等同于: [\t\n\f\r\p{Z}] |
\S | 匹配全部非空格字符: [^\s] |
\f | 匹配一个换页符 |
\n | 匹配一个换行符 |
\r | 匹配一个回车符 |
\t | 匹配一个制表符 |
\v | 匹配一个垂直制表符 |
\p | 匹配 CR/LF (等同于 \r\n ),用来匹配 DOS 行终止符 |
先行断言和后发断言都属于非捕获簇(不捕获文本 ,也不针对组合计进行计数). 先行断言用于判断所匹配的格式是否在另外一个肯定的格式以前, 匹配结果不包含该肯定格式(仅做为约束).
例如, 咱们想要得到全部跟在 $
符号后的数字, 咱们可使用正后发断言 (?<=\$)[0-9\.]*
. 这个表达式匹配 $
开头, 以后跟着 0,1,2,3,4,5,6,7,8,9,.
这些字符能够出现大于等于 0 次.
零宽度断言以下:
符号 | 描述 |
---|---|
?= | 正先行断言-存在 |
?! | 负先行断言-排除 |
?<= | 正后发断言-存在 |
?<! | 负后发断言-排除 |
标志也叫模式修正符, 由于它能够用来修改表达式的搜索结果. 这些标志能够任意的组合使用, 它也是整个正则表达式的一部分.
标志 | 描述 |
---|---|
i | 忽略大小写. |
g | 全局搜索. |
m | 多行的: 锚点元字符 ^ $ 工做范围在每行的起始. |
在这些运算符同时出现时,按照下面的优先级进行操做。
优先级 | 符号 |
---|---|
最高 | \ |
高 | ( )、(?: )、(?= )、[ ] |
中 | *、+、?、{n}、{n,}、{n,m} |
低 | ^、$、中介字符 |
最低 | | |
正则表达式默认采用贪婪匹配模式,在该模式下意味着会匹配尽量长的子串。咱们可使用 ? 将贪婪匹配模式转化为惰性匹配模式。 贪婪模式
(.*nt)
=>People want to try something different
.
惰性模式
(.*?nt)
=>People want
to try something different.
常见的惰性限定符:
符号 | 说明 |
---|---|
*? | 重复任意次,但尽量少重复 |
+? | 重复1次或更屡次,但尽量少重复 |
?? | 重复0次或1次,但尽量少重复 |
{n,m}? | 重复n到m次,但尽量少重复 |
{n,}? | 重复n次以上,但尽量少重复 |
NSString *regex = @"^[0-9]+$";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
NSString *str = @"1314";
if ([predicate evaluateWithObject:str]) {
NSLog(@"Condition Matched");
}
复制代码
NSString *searchText = @"targetString";
NSRange range = [searchText rangeOfString:@"^[0-9]+$" options:NSRegularExpressionSearch];
if (range.location != NSNotFound) {
NSLog(@"target range :%@", [searchText substringWithRange:range]);
}
复制代码
/*
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标准做为词的边界,不然全部传统正则表达式的词边界都有效
};
*/
NSString *searchText = @"what do you want to match string";
NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^[0-9]+$" options:NSRegularExpressionCaseInsensitive error:&error];
//仅取出第一条匹配记录
NSTextCheckingResult *firstResult = [regex firstMatchInString:searchText options:0 range:NSMakeRange(0, [searchText length])];
if (firstResult) {
NSLog(@"firstResult:%@", [searchText substringWithRange:firstResult.range]);
}
//遍历全部匹配记录
NSArray *matches = [regex matchesInString:searchText
options:0
range:NSMakeRange(0, searchText.length)];
for (NSTextCheckingResult *match in matches) {
NSRange range = [match range];
NSString *mStr = [searchText substringWithRange:range];
NSLog(@"AllResult:%@", mStr);
}
复制代码