正则匹配(简)一揽子解决方案
来源:互联网 发布:php aes cbc解密乱码 编辑:程序博客网 时间:2024/05/18 18:15
正则表达式---简
正则在许多语言里边都有出现,php、java、C#、javascript等都有,在各种语言中,正则表达式核心内容都完全一致,不过是每种语言使用正则时语法规则不同而已。
正则表达式的历史
正则表达式的“祖先”可以一直上溯至对人类神经系统如何工作的早期研究。
1956年,一位叫Stephen Kleene的数学家在McCulloch和Pitts早期工作的基础上,发表论文使用了正则表达式。
正则表达式的第一个实用应用程序就是Unix中的qed编辑器
正则表达式作用:
①注册表单域验证
②替换文本内容str_replace()
③提取子字符串(网络爬虫:一个网站去另一个网站偷信息)
声明一个正则表达式
$pat = “/正则内容/”;
1、定界符
上图左右/斜杠代表定界符,除了字母、数字和反斜线\以外的任何字符都可以作为定界符号,比如| |、//、{}、!!、##等等
正则表达式需要使用引号括起来,单双引号都可以,例如:$pat = “/[0-9]/”; 或$pat =‘/[0-9]/’;
2、preg_match()函数
preg_match(正则,目标内容,匹配结果[,下标标志])
正则:设置好的正则表达式
目标内容:被匹配的目标字符串内容
匹配结果:此变量是引用类型,用于接收匹配到的结果,结果是array数组内容(array()空数组表示没有匹配到内容)
下标标志:可选值为PREG_OFFSET_CAPTURE,表示同时返回匹配结果在目标字符串中的下标信息。该参数会更改返回结果数组的维数。
preg_match()函数设置第四个参数的使用(不常用):
preg_match()函数使用细节:
①该函数进行单次匹配,只把第一个符合正则的内容匹配出来,非全局匹配。
例如使用该函数,使得正则/hello/去匹配字符串“hello-beijing hello-shanghai”,则只给匹配第一个hello。
②从目标字符串的左边开始进行匹配,寻找正则对应的目标内容
③默认情况下,该函数给返回一维数组,数组元素值代表匹配的结果
如果该函数有设置第四个参数,则会返回一个二维数组,额外还会返回匹配结果的下标信息
④该preg_match()函数通过返回1/0的信息表示是否有匹配到内容,1:匹配到0:没有匹配到
3.1 正则内容组成
①普通字符,例如数字、字母、特殊符号等,例如$pat = “/hello/”; 是匹配hello的正则
②定义字符集---[a-e],[aeiou]匹配数字、英文字母的一段 ,段的开始到结尾必须由小到大设置
定义字符集里边都可以设置^符号,表示取非,例:[^a-e] 随意匹配除了a到e连续字符以外的其他一个字符
③特殊字符集
④限制字符集
⑤模式修正符
3.2特别字符集
$ 匹配目标字符串的”结尾”位置。
^ “托字符”匹配目标字符串的”开始”位置
( ) 标记一个子表达式的”开始”和”结束”位置
* 表示其前面那个单元出现0次或以上任意次数
. 匹配除换行符\n之外的任何单字符,例如.*表示匹配任何内容
+ 表示其前面那个单元出现1次或以上任意次数
? 表示其前面那个单元出现0次或1次 要么出现、要么不出现
\ 这个符号是用来转义的,去除符号的特殊意思,只保留符号的本质意思
| 指明两项之间只选择一个,或的意思,完整以目标字符串出现的先后顺序去匹配
在设计正则表达式的时候,99%的情况下都需要使用^和$符号
好处:可以使得正则表达式对目标内容进行“完整”匹配(非部分匹配)
完整匹配在某些时候是必须的
^符号在不同场合的使用:
①$pat = “/^hello/”; //hello需要在目标内容开始出现
②$pat = “/[^0-9]/”; //匹配非0到9之间数字以外的其他字符内容
()小括号: 标记一个子表达式的”开始”和”结束”位置
()小括号作用:①提高子表达式优先级②可以从大的字符串中拆分小的内容出来
正则表达式又称为正则表达式模式,如果使用()给模式中的某个小的模式进行限制,该()小括号内容就称为模式单元
$str="2016beijing2018beijing";
$pat="/beijing/";
$pipei=preg_match($pat, $str,$out);
var_dump($pipei);//int(1)
print_r($out);//Array ( [0] => beijing )
echo "<hr>";
preg_match($pat, $str,$out1,PREG_OFFSET_CAPTURE);
print_r($out1);//Array ( [0] => Array ( [0] => beijing [1] => 4 ) )
3.3组合字符集
\d 表示匹配0到9之间的一个数字 是[0-9]的别名
[1-9] 匹配一个非0数字
[5-9] 匹配5到9之间的一个数字
\w 表示匹配(大小写)字母、数字、下划线其中的一个[a-zA-Z0-9_]
\s 表示空格
//匹配hello和beijing中间有三个空格
$pat = “/hello beijing/”; //可读性不好
$pat = “/hello\s\s\sbeijing/”; //可读性好
3.4限制字符
{m} 其前一单元严格出现m次
{m,} 其前一单元出现至少m次,至多不限制
{m,n} 其前一单元出现至少m,至多n次,n比m要大
3.5模式修正符
正则完全的设置:$pat = “/正则内容/模式修正符”;
模式修正符:对正则的使用起着扩充、限制、修订的作用。
i 可同时匹配大小写字母
U 匹配到最近的字符串(避免贪婪匹配)
3.6进行全局匹配
preg_match()可以通过正则对目标字符串进行“单次”匹配
preg_match_all(正则,内容,匹配结果)函数
该函数返回二维数组,可以实现对内容的全局匹配,所有与模式符合的内容都给匹配出来
$str="2016beijing[beiji20/18be*iji(ngdugbeijing";
$pat="/beijing$/";
$str="<h1>monkey like peach or banana</h1>";
$pat="/pear|banana/";//int(1) Array ( [0] => banana )
// $pat="/ban(ana)/";//int(1) Array ( [0] => banana [1] => ana )
// $pat="!<h1>(.*)</h1>!";
$pipei=preg_match($pat, $str,$out); //int(1)
var_dump($out);echo "<hr>";
$str="re23676@21cn.com";
// $str="15845678091";
// $pat="/([0-9]+)-([0-9]+)-([0-9]+)/";
// $pat="/1[358]{2}\d{8}/";//匹配手机号
$pat="#(^[a-z1-9][a-z0-9\.]{5,})@([a-z0-9]+)(\.[a-z0-9\.]+)$#i";//匹配邮箱
$pipei=preg_match($pat, $str,$out);
// echo $out[2],"<br>",$out[3],"<br>";03 01
echo "<pre>";
var_dump($pipei);//int(1)
print_r($out);
echo "<hr>";
preg_match($pat, $str,$out,PREG_OFFSET_CAPTURE);
print_r($out);
array(1) { [0]=> string(6) "banana" }
int(1)Array( [0] => re23676@21cn.com [1] => re23676 [2] => 21cn [3] => .com)
Array
(
[0] => Array(
[0] => re23676@21cn.com
[1] => 0 )
[1] => Array(
[0] => re23676
[1] => 0 )
[2] => Array(
[0] => 21cn
[1] => 8 )
[3] => Array(
[0] => .com
[1] => 12 )
)
正则表达式速查表
n
”匹配字符“n
”。“\n
”匹配一个换行符。串行“\\
”匹配“\
”而“\(
”则匹配“(
”。\n
”或“\r
”之后的位置。\n
”或“\r
”之前的位置。z
”以及“zoo
”。*等价于{0,}。+>=1匹配前面的子表达式一次或多次。例如,“zo+
”能匹配“zo
”以及“zoo
”,但不能匹配“z
”。+等价于{1,}。do(es)?
”可以匹配“does
”或“does
”中的“do
”。?等价于{0,1}。o{2}
”不能匹配“Bob
”中的“o
”,但是能匹配“food
”中的两个o。{n,}n是一个非负整数。至少匹配>=n次。例如,“o{2,}
”不能匹配“Bob
”中的“o
”,但能匹配“foooood
”中的所有o。“o{1,}
”等价于“o+
”。“o{0,}
”则等价于“o*
”。o{1,3}
”将匹配“fooooood
”中的前三个o。“o{0,1}
”等价于“o?
”。请注意在逗号和两个数之间不能有空格。oooo
”,“o+?
”将匹配单个“o
”,而“o+
”将匹配所有“o
”。\
n
”之外的任何单个字符。要匹配包括“\
n
”在内的任何字符,请使用像“(.|\n)
”的模式。\(
”或“\)
”。(|)
”来组合一个模式的各个部分是很有用。例如“industr(?:y|ies)
”就是一个比“industry|industries
”更简略的表达式。Windows(?=95|98|NT|2000)
”能匹配“Windows2000
”中的“Windows
”,但不能匹配“Windows3.1
”中的“Windows
”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。Windows(?!95|98|NT|2000)
”能匹配“Windows3.1
”中的“Windows
”,但不能匹配“Windows2000
”中的“Windows
”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始(?<=95|98|NT|2000)Windows
”能匹配“2000Windows
”中的“Windows
”,但不能匹配“3.1Windows
”中的“Windows
”。(?<!95|98|NT|2000)Windows
”能匹配“3.1Windows
”中的“Windows
”,但不能匹配“2000Windows
”中的“Windows
”。z|food
”能匹配“z
”或“food
”。“(z|f)ood
”则匹配“zood
”或“food
”。[abc]
”可以匹配“plain
”中的“a
”。[^abc]
”可以匹配“plain
”中的“p
”。[a-z]
”可以匹配“a
”到“z
”范围内的任意小写字母字符。[^a-z]
”可以匹配任何不在“a
”到“z
”范围内的任意字符。er\b
”可以匹配“never
”中的“er
”,但不能匹配“verb
”中的“er
”。er\B
”能匹配“verb
”中的“er
”,但不能匹配“never
”中的“er
”。c
”字符。[A-Za-z0-9_]
”。[^A-Za-z0-9_]
”。\x41
”匹配“A
”。“\x041
”则等价于“\x04&1
”。正则表达式中可以使用ASCII编码。.(.)\1
”匹配两个连续的相同字符。常用正则表达式
/^[a-z\d]+(\.[a-z\d]+)*@([\da-z](-[\da-z])?)+(\.{1,2}[a-z]+)+$/
/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/
/^[\u2E80-\u9FFF]+$/
[\u4e00-\u9fa5]匹配中文字符(utf-8)---匹配1到20个中文字符:/^[\u4e00-\u9fa5]{1,20}$/
阅读全文
0 0
- 正则匹配(简)一揽子解决方案
- 正则匹配一揽子方案
- Linux安装一揽子解决方案
- PHP应用-一揽子解决方案
- Java Web开发(JSP、Servlet)乱码的一揽子解决方案
- 正则表达式匹配超链接解决方案
- Teamcenter及其一揽子产品解决方案初步介绍
- 正则匹配从结尾开始的解决方案
- 正则表达匹配-(字符匹配表)
- 关于正则表达式匹配无异常资源耗尽的解决方案
- 算法--一揽子排序算法(1)
- 预匹配(正则表达式)
- 正则匹配汉字(收录)
- 匹配邮箱(正则表达式)
- 01正则匹配(1)
- 正则表达式匹配(字符串)
- 正则匹配
- 正则匹配
- [leetCode刷题笔记]49. Group Anagrams
- 信息采集实现原理Curl一揽子方案
- html表格标题的垂直对齐方式
- CQOI位统计
- html设置单元格大小
- 正则匹配(简)一揽子解决方案
- 正则匹配一揽子方案
- html设置单元格列跨度
- PHP基础一揽子方案
- PHP基础之一揽子方案
- html设置行的跨度
- PHP之AJAX,XML,JSON一揽子方案
- Harbor 源码分析之API(四)
- 331. Verify Preorder Serialization of a Binary Tree