史上最全正则
Posted Flying_in_the_world
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了史上最全正则相关的知识,希望对你有一定的参考价值。
一个正则表达式测试(只可输入中文、字母和数字)
在项目中碰到了正则表达式的运用,正则还是非常强大的,不管什么编程语言,基本上都可以用到。之前在用java时特别是对用户名或密码使用正则非常爽,写脚本上用正则也非常爽,可是到了OC这却把我虐了一把,可能是对OC掌握的不够。这里就罗列了从网上找的很有用的资料,感谢大神们的贡献。
首先举一个例子:
匹配9-15个由字母/数字组成的字符串的正则表达式:
NSString * regex = @"^[A-Za-z0-9]9,15$"; NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex]; BOOL isMatch = [pred evaluateWithObject:txtfldPhoneNumber.text];
假如是在OC里用,一定要注意细节。
列出我在项目中用到的代码:
NSString *regex = @"[a-zA-Z\\u4e00-\\u9fa5][a-zA-Z0-9\\u4e00-\\u9fa5]+"; NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex]; if(![pred evaluateWithObject: nickNameTextField.text]) /* 此动画为弹出buttonqww UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"提示" message:@"昵称只能由中文、字母或数字组成" delegate:self cancelButtonTitle:@"确定" otherButtonTitles: nil]; [alertView show]; return; */ Warning_boxes *reminderView = [[Warning_boxes alloc]init]; [self.view addSubview:reminderView]; reminderView.title_alter.text = @"昵称只能由中文、字母或数字组成"; [reminderView animationStart]; [reminderView release]; /* //此动画为在顶上显示文字 [MPNotificationView notifyWithText:@"昵称只能由中文、字母或数字组成" andDuration:0.5]; */ return;
下一行代码非常关键:
if(![pred evaluateWithObject: nickNameTextField.text])
这里有!一定要注意。因为nickNameTextField.text和pred匹配的时候返回的是YES。所以在判断他们匹配时的情况要加!。
要学好正则的小伙伴,强烈推荐:正则表达式30分钟入门教程
说明:正则表达式通常用于两种任务:1.验证,2.搜索/替换。用于验证时,通常需要在前后分别加上^和$,以匹配整个待验证字符串;搜索/替换时是否加上此限定则根据搜索的要求而定,此外,也有可能要在前后加上\\b而不是^和$。此表所列的常用正则表达式,除个别外均未在前后加上任何限定,请根据需要,自行处理。
说明 | 正则表达式 |
---|---|
网址(URL) | [a-zA-z]+://[^\\s]* |
IP地址(IP Address) | ((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.)3(2[0-4]\\d|25[0-5]|[01]?\\d\\d?) |
电子邮件(Email) | \\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)* |
QQ号码 | [1-9]\\d4, |
html标记(包含内容或自闭合) | <(.*)(.*)>.*<\\/\\1>|<(.*) \\/> |
密码(由数字/大写字母/小写字母/标点符号组成,四种都必有,8位以上) | (?=^.8,$)(?=.*\\d)(?=.*\\W+)(?=.*[A-Z])(?=.*[a-z])(?!.*\\n).*$ |
日期(年-月-日) | (\\d4|\\d2)-((1[0-2])|(0?[1-9]))-(([12][0-9])|(3[01])|(0?[1-9])) |
日期(月/日/年) | ((1[0-2])|(0?[1-9]))/(([12][0-9])|(3[01])|(0?[1-9]))/(\\d4|\\d2) |
时间(小时:分钟, 24小时制) | ((1|0?)[0-9]|2[0-3]):([0-5][0-9]) |
汉字(字符) | [\\u4e00-\\u9fa5] |
中文及全角标点符号(字符) | [\\u3000-\\u301e\\ufe10-\\ufe19\\ufe30-\\ufe44\\ufe50-\\ufe6b\\uff01-\\uffee] |
中国大陆固定电话号码 | (\\d4-|\\d3-)?(\\d8|\\d7) |
中国大陆手机号码 | 1\\d10 |
中国大陆邮政编码 | [1-9]\\d5 |
中国大陆身份证号(15位或18位) | \\d15(\\d\\d[0-9xX])? |
非负整数(正整数或零) | \\d+ |
正整数 | [0-9]*[1-9][0-9]* |
负整数 | -[0-9]*[1-9][0-9]* |
整数 | -?\\d+ |
小数 | (-?\\d+)(\\.\\d+)? |
不包含abc的单词 | \\b((?!abc)\\w)+\\b |
正则表达式:是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串,简单说,就是我们写个模板,然后去匹配字符串。
下面我们来看看一些基本的正则表达式的语法:
\\:将下个字符标记为一个特殊的字符、一个原义字符、一个向后引用或者一个八进制转义符例如“\\n”就是匹配一个换行符。
^:匹配开始位置,^(a)这个就匹配开头必须为a。
$:匹配结束位置,$(a)这个就匹配结尾必须为a。
*:匹配前面的子表达式零次或者多次,如“xu*”这个表达式就能够匹配“x”和“xuu”。
+:匹配前面的子表达式一次或者多次,如“xu+”这个表达式就能够匹配“xuu”和“xu”,但不能够匹配“x”,这个就是和“*”的区别。
?:匹配前面的子表达式零次或者一次,如“xu?”这个表达式就能够匹配“jian(guo)?”就可以匹配“jian”和“jianguo”。
n:n是一个非负数,匹配n次,如“guo2”,可以匹配“guoo”,不能匹配“guo”。
n,:n是一个非负数,匹配至少n次。
n, m:m、n都是非负数,最少匹配n次,最多匹配m次。
(pattern):匹配pattern并获取匹配结果。
(?:pattern):匹配pattern但不获取匹配结果。
x|y:匹配x或y,如“(xu|jian)guo”匹配“xuguo”或者“jianguo”。
[xyz]:字符集合,匹配所包含的任意字符。如“[abc]”可以匹配“apple”中的“a”。
[^xyz]:匹配未被包含的字符。
[a-z]:字符范围,匹配指定范围内的任意字符。
[^a-z]:匹配指定不在范围内的任意字符。
\\b:匹配一个单词的边界,如“guo\\b”可以匹配“xujianguo”中的“guo”。
\\B:匹配非单词边界,如“jian\\B”可以匹配“xujianguo”中的“jian”。
\\d:匹配一个数字字符,等价于“[0-9]”。
\\D:匹配一个非数字字符。
\\f:匹配一个换页符。
\\n:匹配一个换行符。
\\r:匹配一个回车符。
\\s:匹配任何空白字符
其实还有很多语法我就不一一列举了,先说这么多先
一.NSString自带的正则查找,替换方法
正则查找方法
– rangeOfString:options:
– rangeOfString:options:range:
– rangeOfString:options:range:locale:
正则替换方法
– stringByReplacingOccurrencesOfString:withString:options:range:
options参数指定搜索选项,类型为NSStringCompareOptions,可通过位或操作指定为NSCaseInsensitiveSearch, NSLiteralSearch, NSBackwardsSearch, NSAnchoredSearch>等选项的组合。
若指定的选项为NSRegularExpressionSearch,则搜索字符串被认为是ICU兼容的正则表达式,如果指定了此选项,则与其可以同时存在的选项只有NSCaseInsensitiveSearch和NSAnchoredSearch
二.使用RegexKitLite
RegexKitLite向标准NSString类增加了很多方法来使用正则表达式,RegexKitLite使用ios系统自带的ICU(International Components for Unicode)正则引擎处理正则表达式,所以RegexKitLite使用的正则语法为ICU的语法,使用RegexKitLite需要导入libicucore.dylib库。
使用RegexKitLite的方法很简单,将RegexKitLite.h和RegexKitLite.m加入到工程,然后引入libicucore.dylib库即可。
RegexKitLite.h RegexKitLite.m
RegexKitLit NSString方法参考
RegexKitLite NSString Additions Reference
RegexKitLite的使用说明见:
Using RegexKitLite
ICU正则语法为:
ICU Syntax
ICU User Guide – Regular Expressions
三.使用RegexKit.framework框架
RegexKit Framework与RegexKitLite来自同一体系,但其更复杂和强大。RegexKit Framework不使用iOS系统的ICU正则库,而是自带 PCRE(Perl Compatible Regular Expressions)库, 所以其正则语法是PCRE的语法。
RegexKit Framework功能很强大,其向NSArray,NSData,NSDictionary,NSSet和NSString对象增加了正则表达式的支持。
TRegexKit.framework与RegexKitLite的区别
RegexKit.framework | RegexKitLite | |
---|---|---|
Regex Library | PCRE | ICU |
Library Included | Yes, built into framework object file. | No, provided by Mac OS X. |
Library Linked As | Statically linked into framework. | Dynamically linked to/usr/lib/libicucore.dylib. |
Compiled Size | Approximately 371KB† per architecture. | Very small, approximately 16KB—20KB‡ per architecture. |
Style | External, linked to framework. | Compiled directly in to final executable. |
Feature Set | Large, with additions to many classes. | Minimal, NSString only. |
四.常用ICU正则匹配模式
常用的ICU正则匹配模式见:
RegexKitLite Cookbook
数字 Numbers
Description | Regex | Examples |
---|---|---|
Integer | [+\\-]?[0-9]+ | 123-42+23 |
Hex Number | 0[xX][0-9a-fA-F]+ | 0×00xdeadbeef0xF3 |
Floating Point | [+\\-]?(?:[0-9]*\\.[0-9]+|[0-9]+\\.) | 123..123+.42 |
Floating Point with Exponent | [+\\-]?(?:[0-9]*\\.[0-9]+|[0-9]+\\.)(?:[eE][+\\-]?[0-9]+)? | 123..12310.0E131.23e-7 |
Comma Separated Number | [0-9]1,3(?:,[0-9]3)* | 421,2341,234,567 |
Comma Separated Number | [0-9]1,3(?:,[0-9]3)*(?:\\.[0-9]+)? | 421,2341,234,567.89 |
文本文件 Text Files
Description | Regex |
---|---|
Empty Line | (?m:^$) |
Empty or Whitespace Only Line | (?m-s:^\\s*$) |
Strip Leading Whitespace | (?m-s:^\\s*(.*?)$) |
Strip Trailing Whitespace | (?m-s:^(.*?)\\s*$) |
Strip Leading and Trailing Whitespace | (?m-s:^\\s*(.*?)\\s*$) |
Quoted String, Can Span Multiple Lines, May Contain \\" | "(?:[^"\\\\]*+|\\\\.)*" |
Quoted String, Single Line Only, May Contain \\" | "(?:[^"\\\\\\r\\n]*+|\\\\[^\\r\\n])*" |
HTML Comment | (?s:<--.*?-->) |
Perl / Shell Comment | (?m-s:#.*$) |
C, C++, or ObjC Comment | (?m-s://.*$) |
C, C++, or ObjC Comment and Leading Whitespace | (?m-s:\\s*//.*$) |
C, C++, or ObjC Comment | (?s:/\\*.*?\\*/) |
网络与URL相关 Network and URL
Description | Regex |
---|---|
HTTP | \\bhttps?://[a-zA-Z0-9\\-.]+(?:(?:/[a-zA-Z0-9\\-._?,'+\\&%$=~*!():@\\\\]*)+)? |
HTTP | \\b(https?)://([a-zA-Z0-9\\-.]+)((?:/[a-zA-Z0-9\\-._?,'+\\&%$=~*!():@\\\\]*)+)? |
HTTP | \\b(https?)://(?:(\\S+?)(?::(\\S+?))?@)?([a-zA-Z0-9\\-.]+)(?::(\\d+))?((?:/[a-zA-Z0-9\\-._?,'+\\&%$=~*!():@\\\\]*)+)? |
\\b([a-zA-Z0-9%_.+\\-]+)@([a-zA-Z0-9.\\-]+?\\.[a-zA-Z]2,6)\\b | |
Hostname | \\b(?:[a-zA-Z0-9][a-zA-Z0-9\\-]0,61?[a-zA-Z0-9]\\.)+[a-zA-Z]2,6\\b |
IP | \\b(?:\\d1,3\\.)3\\d1,3\\b |
IP with Optional Netmask | \\b((?:\\d1,3\\.)3\\d1,3)(?:/(\\d1,2))?\\b |
IP or Hostname | \\b(?:(?:\\d1,3\\.)3\\d1,3|(?:[a-zA-Z0-9][a-zA-Z0-9\\-]0,61?[a-zA-Z0-9]\\.)+[a-zA-Z]2,6)\\b |
五.贪婪匹配与最小匹配
在正则表达式中单独使用*或+时,默认是匹配尽可能多的数据,即贪婪匹配。
* Match zero or more times. Match as many times as possible. + Match one or more times. Match as many times as possible.
比如对 abcdefgabcdefg 使用abc(.*)g进行匹配,则捕获到到的数据为 defgabcdef。
若只想捕获到第一个g,即只想得到def,则需要使用最小匹配,在*或+后面加上?,即使用abc(.*?)g进行匹配。
*? Match zero or more times. Match as few times as possible. +? Match one or more times. Match as few times as possible.
另外,在正则中用(…)包含内容是要捕获的数据,如果只要用(…)来引用group而不想捕获则可使用(?:…)。
(…) Capturing parentheses. Range of input that matched the parenthesized subexpression is available after the match. (?:…) Non-capturing parentheses. Groups the included pattern, but does not provide capturing of matching text. Somewhat more efficient than capturing parentheses.
六.正则表达式书写格式
在书写正则表达式时,需要将\\进行转义,即写成两个\\\\。
例如 匹配IP地址的正则表达式为 \\b(?:\\d1,3\\.)3\\d1,3\\b,则在实际书写时则为
NSString *regex = @"\\\\b(?:\\\\d1,3\\.)3\\\\d1,3\\\\b";
参考:
iOS 开发中使用正则表达式-暨 RegexKitLite 库的用法
RegexKitLite Documentation
[perl]理解贪婪匹配和最小匹配之间的区别
NSString Class Reference
ICU – International Components for Unicode
来源:http://blog.csdn.net/zeng11088/article/details/8766121
常用的第三方正则库: http://regexkit.sourceforge.net/RegexKitLite/index.html
匹配中文字符的正则表达式: [\\u4e00-\\u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了
匹配双字节字符(包括汉字在内):[^\\x00-\\xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
匹配空白行的正则表达式:\\n\\s*\\r
评注:可以用来删除空白行
匹配HTML标记的正则表达式:<(\\S*?)[^>]*>.*?</\\1>|<.*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
匹配首尾空白字符的正则表达式:^\\s*|\\s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
匹配Email地址的正则表达式:\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*
评注:表单验证时很实用
匹配网址URL的正则表达式:[a-zA-z]+://[^\\s]*
以上是关于史上最全正则的主要内容,如果未能解决你的问题,请参考以下文章