Chang
Chang
正则表达式学习笔记

正则过于重要(最近越来越多用到:Java的split函数、js、nginx的配置、Linux),但是我基本8会写,所以一边学一边记录下。

工具/网站安利

  • RegExp Tester:一个用于测试的chrome扩展,体积小且方便。
  • regexone:交互式学习和练习正则表达式的网站。

部分基础语法

(PS:因为我就看会了这点,有不对的还请各位大佬指出,也可能手抖敲错了

元字符

  • \b:代表着单词的开头或结尾,也就是单词的分界处,它只匹配一个位置。
  • \w:匹配字母或数字或下划线或汉字。
  • \d:匹配数字,可以代替0到9之间的任何数字。
  • .:匹配任何单个字符(字母,数字,空格,所有内容),实际上会覆盖句号字符的匹配,因此,为了专门匹配句号,使用斜杠\来使句号转义。
  • \s:匹配任意的空白符。
  • ^:匹配字符串的开始。
  • $:匹配字符串的结束。
  • ():小括号来指定子表达式(也叫做分组),然后可以对这个表达式指定各项操作。

    转义

    查找元字符本身需要\转义,例:

  • regtest\.py匹配regtest.py
  • C:\\Windows匹配C:\Windows

    反义

  • \B:匹配不是单词开头或结束的位置。
  • \W:匹配任意不是字母,数字,下划线,汉字的字符。
  • \D:匹配任意非数字的字符。
  • \S:匹配任意不是空白符的字符。
  • [\^x]:匹配除了x以外的任意字符。
  • [\^aeiou]:匹配除了aeiou这几个字母以外的任意字符。
    例:
  • \S+ :匹配不包含空白符的字符串。
  • <a[^>]+> :匹配用尖括号括起来的以a开头的字符串。

    重复

  • *:重复零次或更多次D
  • +:重复一次或更多次
  • ?:重复零次或一次
  • {n}:重复n次
  • {n,}:重复n次或更多次
  • {n,m}:重复n到m次

例:

  • Windows\d+:匹配Windows后面跟1个或更多数字。
  • \^\w+:匹配 一行的第一个单词(或整个字符串的第一个单词)。

    字符范围

    []表示法中:

  • -:表示字符范围。
  • ^:表示不要某几个字符。
    例:
  • [0-6]:仅会匹配从零到六个的任何一位数字字符。
  • [^ np]:将仅匹配任何单个字符,但字母n至p除外。

    后向引用、分组、捕获

    默认情况下,每个分组会自动拥有一个组号,规则 是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。
    捕获

  • (exp):匹配exp,并捕获文本到自动命名的组里。
  • (?exp):匹配exp,并捕获文本到名称为name的组里,也可以写成 (?'name'exp)
  • (?:exp):匹配exp,不捕获匹配的文本,也不给此分组分配组号。(PS:不会改变正则表达式的处理方式,只是这样的组匹配的内容 不会像前两种那样 被捕获到某个组里面,也不会拥有组号。
    零宽断言
  • (?=exp):匹配exp前面的位置
  • (?<=exp):匹配exp后面的位置
  • (?!exp):匹配后面跟的不是exp的位置
  • (?<!exp):匹配前面不是exp的位置
    注释
  • (? #comment):这种类型的分组不对正则表达式的处理产生任何影响,用于提 供注释让人阅读

    懒惰匹配

    匹配尽可能少的字符

  • *?:重复任意次,但尽可能少重复
  • +?:重复1次或更多次,但尽可能少重复
  • ??:重复0次或1次,但尽可能少重复
  • {n,m}?:重复n到m次,但尽可能少重复
  • {n,}?:重复n次以上,但尽可能少重复

常用的部分正则表达式

整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$
只能输入数字:^[0-9]*$
只能输入n位的数字:^\d{n}$
只能输入至少n位的数字:^\d{n,}$
只能输入m到n位的数字:^\d{m,n}$
只能输入零和非零开头的数字:^(0|[1-9][0-9]*)$
只能输入有两位小数的正实数:^[0-9]+(.[0-9]{2})?$
只能输入有1到3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$
只能输入非零的正整数:^\+?[1-9][0-9]*$
只能输入非零的负整数:^\-[1-9][]0-9″*$
只能输入长度为3的字符:^.{3}$
只能输入由26个英文字母组成的字符串:^[A-Za-z]+$
只能输入由26个大写英文字母组成的字符串:^[A-Z]+$
只能输入由26个小写英文字母组成的字符串:^[a-z]+$
只能输入由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
只能输入由数字、26个英文字母或者下划线组成的字符串:^\w+$
验证用户密码:^[a-zA-Z]\w{5,17}$
正确格式为:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。验证是否含有^%&’,;=?$\等字符:[^%&',;=?$\x22]+
只能输入汉字:^[\u4e00-\u9fa5]{0,}$
验证Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
验证InternetURL:^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$

验证电话号码:^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$
正确格式为:XXX-XXXXXXXXXXX-XXXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXX

验证身份证号(15位或18位数字):^\d{15}|\d{18}$

验证一年的12个月:^(0?[1-9]|1[0-2])$
正确格式为:”01″~”09″”1″~”12″

验证一个月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$
正确格式为;”01″~”09″和”1″~”31″。

匹配中文字符的正则表达式: [\u4e00-\u9fa5]
匹配双字节字符(包括汉字在内):[^\x00-\xff]
应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)String.prototype.len=function(){return this.replace(/[^\x00-\xff]/g,”aa”).length;}
匹配空行的正则表达式:\n[\s| ]*\r
匹配html标签的正则表达式:<(.*)>(.*)<\/(.*)>|<(.*)\/>

匹配首尾空格的正则表达式:(^\s*)|(\s*$)
应用:javascript中没有像vbscript那样的trim函数,我们就可以利用这个表达式来实现,如下:
String.prototype.trim = function(){return this.replace(/(^\s*)|(\s*$)/g, “”);}

利用正则表达式分解和转换IP地址:
下面是利用正则表达式匹配IP地址,并将IP地址转换成对应数值的Javascript程序:

function IP2V(ip){re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匹配IP地址的正则表达式
if(re.test(ip)){return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1}else{throw new Error(“Not a valid IP address!”)}}
//上面的程序直接用split函数来分解
var ip=”10.100.20.168″ip=ip.split(“.”)alert(“IP值是:”+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))

匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匹配网址URL的正则表达式:http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?
利用正则表达式限制网页表单里的文本框输入内容:
用正则表达式限制只能输入中文:

onkeyup=”value=value.replace(/[^\u4E00-\u9FA5]/g,”)” onbeforepaste=”clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^\u4E00-\u9FA5]/g,”))”

用正则表达式限制只能输入全角字符:

 onkeyup=”value=value.replace(/[^\uFF00-\uFFFF]/g,”)” onbeforepaste=”clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^\uFF00-\uFFFF]/g,”))”

用正则表达式限制只能输入数字:

onkeyup=”value=value.replace(/[^\d]/g,”) “onbeforepaste=”clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^\d]/g,”))”

用正则表达式限制只能输入数字和英文:

onkeyup=”value=value.replace(/[\W]/g,”) “onbeforepaste=”clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^\d]/g,”))”

匹配中文字符的正则表达式: [\u4e00-\u9fa5]
匹配双字节字符(包括汉字在内):[^\x00-\xff]
用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)匹配空白行的正则表达式:\n\s*\r

可以用来删除空白行匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?|<.*? />(仅对部分简单情况适用)
匹配首尾空白字符的正则表达式:^\s*|\s*$
可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
表单验证时很实用匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
表单验证时很实用匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7} 匹配形式如 0511-4405222021-87888822
匹配腾讯QQ号:[1-9][0-9]{4,}
从10000开始匹配中国邮政编码:[1-9]\d{5}(?!\d) 中国邮政编码为6位数字
匹配ip地址:((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
匹配正整数^-[1-9]\d*$
匹配负整数^-?[1-9]\d*$
匹配整数^[1-9]\d*|0$
匹配非负整数(正整数 + 0)^-[1-9]\d*|0$
匹配非正整数(负整数 + 0)^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$
匹配正浮点数^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$
匹配负浮点数^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$
匹配浮点数^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
匹配非负浮点数(正浮点数 + 0)^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$  
匹配非正浮点数(负浮点数 + 0)^[A-Za-z]+$ (处理大量数据时有用,具体应用时注意修正匹配特定字符串)
匹配由26个英文字母组成的字符串^[A-Z]+$
匹配由26个英文字母的大写组成的字符串^[a-z]+$
匹配由26个英文字母的小写组成的字符串^[A-Za-z0-9]+$
Email : /^\w+([-+.]\w+)*@\w+([-.]\\w+)*\.\w+([-.]\w+)*$/
isEmail1 : /^\w+([\.\-]\w+)*\@\w+([\.\-]\w+)*\.\w+$/;
isEmail2 : /^.*@[^_]*$/;
Phone : /^((\(\d{3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}$/
Mobile : /^((\(\d{3}\))|(\d{3}\-))?13\d{9}$/

发表评论

textsms
account_circle
email

Chang

正则表达式学习笔记
正则过于重要(最近越来越多用到:Java的split函数、js、nginx的配置、Linux),但是我基本8会写,所以一边学一边记录下。 工具/网站安利 RegExp Tester:一个用于测试的chrome扩展,体…
扫描二维码继续阅读
2020-05-07