关于正则表达式的学习笔记

正则表达式
正则表达式是用来进行文本匹配的工具。当需要查找符合某些复杂规则的字符串时就需要用到正则表达式。
它是记录文本规则的代码。
\d+ 表示规则1位或者更多的数字,2008符合,A3不符合,和*类似,但是*表示重复任意次(包括0次),+至少为一次或者多次
\bhi\b 精确查找"hi"这个单词,而不是包含hi的单词(比如high),\b是正则表达式的特殊代码
代表的是单词的开头或者结尾。
例子:需要找到hi 后面不远处跟着的一个Lucy,应该使用\bhi\b.*\bLucy\b.
. 代表除了换行符以外的任意字符,*代表数量,表示*前面的内容可以重复任意次以使整个表达式得到匹配。
两个符号连在一起使用.*表示任意数量的不包含换行的字符。
由此上面的例子就是\bhi\b.*\bLucy\b的意思是:显示一个hi,然后任意个任意字符(但是不能换行)最后是Lucy这个单词。


匹配电话号码:0\d\d-\d\d\d\d\d\d\d\d
表示前面是以0开头的三位数,接一个“-”符号,后面跟着8位数字。
可以简写成0\d{2}-\d{8}。表示前面的\d必须出现2次后面出现8次。


\s表示任意空白符,包括空格,制表符(tab),换行符。
\w表示字母或者数字
实例:匹配123abc de,给一个字符串:3123bc de12384953
\b123\w*\s\w{2}\b


^表示字符串的开始 $表示字符串的结束。
^以及$和\b有点类似。都代表字符串的开始和结束。验证输入时非常有用
例子:输入5-10位的QQ号。 ^\d{5,10}$
这里{5,10}和{2}类似。区别在于{2}表示不多不少必须重复2次。而{5,10}重复大于5次少于10次。否则都不算匹配




字符转义
如果要查找"."或者"*"这一类的字符的话,就需要在前面加上一个"\",比如\.和\*。如果要查找"\",就用\\


正则表达式中所有指定重复的方式:
* 表示0次或者多次重复
+ 表示1次或者多次重复
?表示0次或者1次重复
{n} 表示n次重复
{n,m} 表示重复次数大于n次小于m次
{n,}  表示重复次数大于n次
实例:
Window\d+ 表示匹配window后面有1个或者多个数字
13\d{9}   表示匹配13开头后面跟着9个数字
^\w+  表示匹配匹配一行的第一个单词


字符类
要匹配a,e,i,o,u五个元音字母就需要用[aeiou],只要在括号中列出他们就可以了,[aeiou]会匹配如何一个元音字母、
[?!.]匹配标点符号(?或者!或者.)。
也可以在[]指定范围,例如:[0-9]和\d意义完全一致 [a-z0-9A-Z]等同于\w。


\(?0\d{2}[) -]?\d{8}表示含义 如果有(则以(开头,没有则以0开头,接2个数字,接着包含)"空格" -出现0次或者1次接着8个数字
(01212345678或者(012 12345678或者(012)12345678 000-12346587


反义:
\W 匹配任意不是字母和数字的字符
\S 匹配任意不是制表符的字符
\D 匹配任意不是数字的字符
\B 匹配不是单词开头或者结束的位置
[^x]    匹配任意除了x以外任意的字符
[^aeiou]匹配任意除了元音字符以外的字符
例子:\S+ 表示不包含空位符的字符串
<a[^>]+> 表示一个尖括号内部a开头的不包含>的字符串


替换
正则表达式中的替换指的是有几种规则,如果满足其中的任意一种就应该匹配,具体方法用|隔开。
注意!:\d{5}-\d{4}|\d{5} 这个代表是美国的邮编,规则是5位数字或者是连字号间隔的9位数字。
如果改成\d{5}|\d{5}-\d{4} 就会出错,他只会匹配5位的邮编(以及9位邮编的前五位)。
上面的原因是匹配替换是,将会从左到右的测试每个条件,如果满足了某个条件的话,就不去管其他的替换条件了,就好像IF ELSEIF
Windows98|Windows2000|WindosXP 表示替换不仅仅能用于两个规则还能用于多个规则。


分组
 如果一个字符串可以用小括号指定的子表达式(也叫作分组),然后就可以制定这个子表达式的重复次数。
例子(\d{1,3}\.){3}\d{1,3} 简单的ip地址匹配表达式。\d{1,3}代表1到3位的数字,(\d{1,3}\.}{3}代表三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(\d{1,3})。
但是上面这种方法会匹配到一些超出范围且没有意义的ip地址比如,256.888.999.666这种地址。所以要真正实现ip地址的匹配的话需要用到以下这种正则表达式
((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)   
这个正则表达式判断ip地址会漏掉一种错误,比如192.168.01.110 这个ip就会报错应该写成((?:(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d))))


后向应用
使用小括号指定一个子表达式后,匹配这个子表达式的文本可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号
规则是:以分组的左括号为标志,从左向右,第一个分组的组号为1,第二个为2,以此类推。
例子:
\b(\w+)\b\s+\1\b 就像go go,kitty kitty 用来匹配重复的单词,相当于把w+里面的内容截取,第一个括号的组号为1,后面的\1就重新写一遍1括号中的字符串
同时也可以自己定义组名
语法:(?<Word>\w+)  这样就把\w+的组名制定为Word了,也就不再是默认的1了。要反向引用这个分组捕获的内容可以用\k<Word>
上面的例子可以写成\b(?<Haha>\w+)\bs+\k<Haha>\b
使用小伙好有很多特定用途的写法。比如
捕获:
(exp) 匹配exp,并捕获文本到自动命名的组里
(?<name>exp) 匹配exp,并捕获文本到名为name的组里
(?:exp) 匹配exp,不捕获匹配的文本
位置制定(零宽断言)
(?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置
注释
(?#comment) 这种类型的组不对正则表达式的处理产生任何影响,只是为了提供让人阅读注释


位置制定
(?=exp) 零宽先行断言,它匹配文本中的某些位置,这个位置的后面能匹配到给定的后缀exp。
例如\b\w+(?=ing\b) 就是匹配以ing结尾的单词的前面部分。比如string 匹配之后就是str
(?<=exp) 零宽后行断言,它匹配文本中的某些位置,这个未知的前面能匹配到给定的前缀exp。
例如(?<=\bre)\w+\b 会匹配以re开头的单词的后面部分。比如recover匹配之后就是cover
举例:(?<=\s)\d(?=\s) 匹配以空白符间隔的数字(不包括这些空白符)


负向位置指定
(?!exp) 零宽负向先行断言,只会匹配后缀exp不存在的位置。例如:\d{3}(?!\d) 匹配三个数字,且这三个数字后面不能是数字


贪婪与懒惰
贪婪匹配:当正则表达式包含能接受重复的两次(指定数量的代码、例如*,{5,10})时,通常的行为是匹配尽可能多的字符。比如a.*b,如果用它来搜索aabab的话,它将匹配整个字符串aabab。
懒惰匹配:也就是尽可能少的字符,量词都可以被转化为懒惰匹配模式,只要在它后面加上一个?。 .*?就代表匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。
例子:a.*?b匹配最短的以a开始以b结束的字符串,当用它来搜索aabab时,他会匹配aab和ab。


懒惰量词
*? 重复任意次,但尽可能少的重复
+? 重复1次或者多次,但尽可能少重复
?? 重复0次或者1次,同上
{n,m} 重复n到m次,同上
{n,}? 重复n次或者n次以上,同上。


总而言之:先在<input>里输入οnkeyup="value=value.replace(/[^\X]/g,'')" 然后在(/[\X]/g,'')里的X换成你想输入的代码就可以了
123

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值