正则表达式基础总结

正则表达式的基础:
这里写图片描述

1、正则表达式的概念:
正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
给定一个正则表达式和另一个字符串,我们可以达到如下的目的:
1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);
2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。
正则表达式的特点是:
1. 灵活性、逻辑性和功能性非常的强;
2. 可以迅速地用极简单的方式达到字符串的复杂控制。
2、什么时候会用到正则表达式
工作中经常会用正则表达式用来验证字符串是否符是一个电子邮箱、身份证号、电话号码等。正则表达式还可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。
以下举例说明正则表达式用来验证字符串是否符合某个模式:
例1:
Q:“^”的作用
A:匹配输入字符串开始的位置,比如^\d+ ,123ww123\d+  ,既匹配123,也匹配ww123.“$”同理匹配字符串结束的位置。

例2:
Q:只能输入一个数字
A:^[-]?\d$
数字可为正数也可为负数,则“-”可出现0次或1次,可用“?”或{0,1}修饰。

例3:
Q:简单说明下RegExp 对象的 Multiline 属性
A:regexp有3个常用的标志global、ignoreCase、multiline
g:执行一个全局匹配。简而言之,就是找到所有的匹配,而不是在找到第一个之后就停止。
i:执行大小写不敏感的匹配,之前我们介绍的大写就是大写,小写就是小写,如果加上i标志后,大小写通吃。如/^[a-z]+ /personPerson/ [ az]+  /i两种都匹配
m:多行模式,^匹配一行的开头和字符串的开头,$匹配一行的结尾或字符串的结尾 结合例子说明(匹配字符串开始或结束存在换行符)

例4:
Q:电子邮箱的正则表达式
A:/^\w+([.-]?\w+)@\w+([.-]?\w+)(.\w{2,3})+$/
说明:表达式\w 表示任意单一字符,包括a~z 、A~Z 、0~9 或下划线。电子邮件必须这些字符之一开头。
加号+ 表示我们要寻找前面条目的一次或多次出现。
园括号() 表示一个组,这意味着后面要引用圆括号中的所有内容,所以现在将它们放在一个组中。
放括号[] 用来表示可以出现其中的任意一个字符。在这个示例中,方括号内包含字符.- 。我们希望允许用户输入点号或连字符,但是点号对于正则表达式有特殊的意义,所以需要在它前面加上反斜杠, 在特殊字符前加反斜杠表示“对字符转义”,经转义后的字符表示其本身意义。因为有方括号,输入字符串在这个位置可以有一个点号或一个连字符,但是两种不能同时存在。
问号?表示前面的条目可以出现一次或不出现。所以电子邮件地址的第一部分中可以有一个点号或一个连字符,也可以没有。
在?后面,再次使用\w+ ,表示点号或连字符后面必须有其他字符。
在()后面出现的* 号,表示前面的条目可以出现零次或多次。所以圆括号中的内容可以出现零次或多次。
@ 字符代表其本身,没有任何其他意义,这个字符位于电子邮件地址和域名之间。
@ 字符后再次出现\w+ ,表示@ 后必须出现字符。在此之后,再次出现([.-]?\w+)*, 表示电子邮件地址的后缀中允许出现点号或连字符。
然后,在一对圆括号中建立另一个组(.\w{2,3}), 表示我们希望找到一个点号,后面跟一些字符。在这个示例中,花括号中的数字表示前面的条目可以出现2 到3 次。在这个组的后面是一个+ 号,表示前面的条目(这个组)必须出现一次或多次。这会匹配.com 或.edu 之类的,也与ox.ac.uk 匹配。

例5:
Q:验证手机号的正则表达式,因手机号号段较多,仅取移动的几个号段来验证134.135.136.137.138.139.150.151.152.157.158.159.187.188
A:^1(3[4-9]|5[012789]|8[78])\d{8}$

例6:
Q:验证18位的身份证号码
A: ^\d{17}([0-9]|X)$
身份证最后一位可能是字母X

例7:
Q:匹配图片格式
A:/[^\s]+.(jpg|gif|png|bmp)/i 或/[\S]+.(jpg|gif|png|bmp)/i
\S匹配非空白字符

例8:
Q:[xyz]和[^xyz]浅析
A:[xyz]表示只要匹配其中的任一字符则返回true,而[^xyz]表示只要有一个字符不匹配给出的字符,不是不能包含其中任一个的意思。则返回true。如wen匹配[wsd],wen也匹配[^wsd]。

例9:
Q:^, \bA: ,   匹配的是首尾字符,而\b匹配的是首尾位置。如abc,用^a$会匹配失败,而\ba\b则会匹配成功返回a,即返回的是字符串开始的这个位置的字符。
3、贪心模式
正则表达式中经常会看到{n,}?, ?, +?, ??, {m,n}?这种写法,在正则中这叫贪心模式,先用一个例子解释下什么叫贪心模式,如^c{1,} ,cccccc c 1,?  返回匹配的结果为c,即正则表达式会尽量多去匹配字符串,这就叫贪心模式。若我们希望正则表达式尽量少匹配字符,则可以在表示数字的符号后加上?,如?,+?,??,{m,}?,{m,n}?.

4、反向引用
反向引用的表达式:/(子正则表达式)\1/

运用的场景:反向引用的作用通常是用来查找或限定重复、查找或限定指定标识配对出现等等。

源字符串:abcdebbcde
正则表达式:([ab])\1
对于正则表达式“([ab])\1”,捕获组中的子表达式“[ab]”虽然可以匹配“a”或者“b”,但是捕获组一旦匹配成功,反向引用的内容也就确定了。如果捕获组匹配到“a”,那么反向引用也就只能匹配“a”,同理,如果捕获组匹配到的是“b”,那么反向引用也就只能匹配“b”。由于后面反向引用“\1”的限制,要求必须是两个相同的字符,在这里也就是“aa”或者“bb”才能匹配成功。
考察一下这个正则表达式的匹配过程,在位置0处,由“([ab])”匹配“a”成功,将捕获的内容保存在编号为1的组中,然后把控制权交给“\1”,由于此时捕获组已记录了捕获内容为“a”,“\1”也就确定只有匹配到“a”才能匹配成功,这里显然不满足,“\1”匹配失败,由于没有可供回溯的状态,整个表达式在位置0处匹配失败。
正则引擎向前传动,在位置5之前,“([ab])”一直匹配失败。传动到位置5处时,,“([ab])”匹配到“b”,匹配成功,将捕获的内容保存在编号为1的组中,然后把控制权交给“\1”,由于此时捕获组已记录了捕获内容为“b”,“\1”也就确定只有匹配到“b”才能匹配成功,满足条件,“\1”匹配成功,整个表达式匹配成功,匹配结果为“bb”,匹配开始位置为5,结束位置为7。
简单的理解就是前面匹配并捕获的字符串会被后面的\1作为模式的一部分。

例10:
Q:正则表达式:(\w)((?=\1\1\1)(\1))+ 源字符串 :wwwaaaaaccccccc11111111
A:用match方法返回的结果是:aaa,ccccc,111111。
“(\w)”匹配一个字符,占一位,“\1”是对“\w”匹配内容的引用,(?=\1\1\1)表示\w匹配的字符后面要连续出现3次,(“(?=pattern)”是非捕获匹配,即要足pattern的条件,但不捕获pattern匹配的字符,后面会介绍)搜索到第一个w时,后面没有连续的3个w,第一个w就不匹配,同理后面的两个w也不匹配,搜素到第一个a时,后面有连续的3个a,匹配,但后面的3个a只作为满足的条件,并不捕获输出,则(\1)匹配到第二个a,因为“+”的作用,会继续用(?=\1\1\1)(\1)去匹配,接着判断第二个a后面是否满足连续的3个a,满足则(\1)匹配到了第3个a;后面ccccc和111111的捕获同理。

5、(pattern)、(?:pattern)、(?=pattern)、(?!pattern)的理解。
()有分组的意思,(pattern)在用exec或match方法时不仅会返回匹配的字符串,还会返回pattern匹配的字串
例11:
Q: /caadg(\d+)/去匹配dcaadg12344gcb,得出匹配的字符串
A:首先得到的是caadg12344这个字符串,这是由caadg(\d+)这个整体的模式匹配得到的,还会得到12344,这是由\d+匹配得到的。如果我不想得到捕获的子串,那我们就要用到(?=pattern),即我要得到的字符串要满足pattern,但我不需要返回pattern匹配的字符串,上面给到的例子,将正则表达式换为/caadg(?=\d+)/,调用exec方法将得到的只有caadg。而(?!=pattern)则与(?=pattern)相反,即caadg后面的字符不与pattern匹配,上面给出的dcaadg12344gcb将不会匹配/caadg(?!=\d+)/,而dcaadgaaa12344gcb会匹配成功,匹配的字符串仍为caadg。

常用正则表达式:
1。^\d+$  //匹配非负整数(正整数 + 0)
2。^[0-9][1-9][0-9] //3 ( (\d+)|(0+))    //匹配非正整数(负整数 + 0)
4。^-[0-9][1-9][0-9] //5  ?\d+      //匹配整数
6。^\d+(.\d+)?$  //匹配非负浮点数(正浮点数 + 0)
7。^(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9])) //8 ( (\d+(.\d+)?)|(0+(.0+)?))    //匹配非正浮点数(负浮点数 + 0)
9。^(-(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9]))) //10 ( ?\d+)(.\d+)?    //匹配浮点数
11。^[A-Za-z]+ //2612 [ AZ]+    //匹配由26个英文字母的大写组成的字符串
13。^[a-z]+ //2614 [ AZaz09]+    //匹配由数字和26个英文字母组成的字符串
15。^\w+ //26线16 [ \w]+(.[\w]+)@[\w]+(.[\w]+)+      //匹配email地址
17。^[a-zA-z]+://匹配(\w+(-\w+))(.(\w+(-\w+)))(\?\S)?$  //匹配url
18。匹配中文字符的正则表达式: [\u4e00-\u9fa5]
19。匹配双字节字符(包括汉字在内):[^\x00-\xff]
20。应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
String.prototype.len=function(){return this.replace([^\x00-\xff]/g,”aa”).length;}
21。匹配空行的正则表达式:\n[\s| ]*\r
22。匹配HTML标记的正则表达式:/<(.)>.<\/\1>|<(.*) \/>/
23。匹配首尾空格的正则表达式:(^\s*)|(\s*$)

  • 正则表达式用例
  • 1、^\S+[a-z A-Z]$ 不能为空 不能有空格 只能是英文字母
  • 2、\S{6,} 不能为空 六位以上
  • 3、^\d+$ 不能有空格 不能非数字
  • 4、(.*)(.jpg|.bmp)$ 只能是jpg和bmp格式
  • 5、^\d{4}-\d{1,2}-\d{1,2}$ 只能是2004-10-22格式
  • 6、^0$ 至少选一项
  • 7、^0{2,}$ 至少选两项
  • 8、^[\s|\S]{20,}$ 不能为空 二十字以上(应该是所有字符20字以上,包含空)
  • 9、^+?a-z0-9*@([a-z0-9]+(.|-))+[a-z]{2,6}$邮件
  • 10、\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)([,;]\s\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)) 输入多个地址用逗号或空格分隔邮件
  • 11、^(([0-9]+))?[0-9]{7,8}$电话号码7位或8位或前面有区号例如(022)87341628
  • 12、^[a-z A-Z 0-9 ]+@[a-z A-Z 0-9 ]+(.[a-z A-Z 0-9 ]+)+(,[a-z A-Z 0-9 ]+@[a-z A-Z 0-9 ]+(.[a-z A-Z 0-9 ]+)+)*$
  • 只能是字母、数字、下划线;必须有@和.同时格式要规范 邮件
  • 13 ^\w+@\w+(.\w+)+(,\w+@\w+(.\w+)+)*$上面表达式也可以写成这样子,更精练。
    14 ^\w+((-\w+)|(.\w+))\@\w+((.|-)\w+).\w+$

C#中正则表达式的用法
1、 引入System.Text.RegularExpressions命名空间。
2、 正则表达式构造一个Regex类。
3、 使用Regex类的IsMatch方法验证匹配。Regex类的IsMatch()方法返回一个bool值,如果有匹配项,返回true,否则返回false。

PS:正则,有个好用的测试工具:RegexTester

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值