正则表达式

简单的说,正则表达式是一种可以用于模式匹配和替换的强有力的工具。其作用如下:
测试字符串的某个模式。例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证。
替换文本。可以在文档中使用一个正则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字。
根据模式匹配从字符串中提取一个子字符串。可以用来在文本或输入字段中查找特定文字。


基本语法
正则表达式的形式一般如下:操作符 描述 \ 转义符 (), (?:), (?=), [] 圆括号和方括号 *, +, ?, {n}, {n,}, {n,m} 限定符 ^, $, \anymetacharacter 位置和顺序 | “或”操作

在构造正则表达式之后,就可以象数学表达式一样来求值,也就是说,可以从左至右并按照一个优先权顺序来求值。

菜鸟测试工具

单字符匹配. \d \D [ ]  \s \S \w \W

其中 . 表示 匹配(除了\n)任意一个字符  , 另外\n就是换行符不匹配  

\d 匹配纯数字  的一个字符 ,等价于 [0-9]。
\D 匹配任意非数字的一个字符,等价于 [^0-9]。

\s 匹配空白,即时空格键和Tab键  , 等价于 [ \f\n\r\t\v]。
\S 匹配任意不是空白符的字符

\w 匹配字母,数字,下划线 ,可以说等价于0-9a-zA-Z和_下划线,但是范围太广,除了不是符号+-*/=!等等以外,\w依然匹配每个国家的语言,如汉字,日文等等。

\W 匹配任意不是字母,数字,下划线 的字符,等价于'[^A-Za-z0-9_]'。

范围:以[开始,以]结束,作用于一个字符匹配的范围,比如[abc],在这个位置字符里面匹配到a或b或c都成立 ,如[1-36-9]则匹配的是1到3和6到9之间的一个数字,如[1-8a-zA-Z] 都是匹配一个字符取值的范围。

[abc匹配在abc范围内,就是中括号写什么 这一个字符就匹配什么
[^abc匹配除了a或b或c以外的任意字符,就是不在abc范围内的字符
 

匹配多个字符 * + ? {n} {n,} {n,m} 限定符这6种也叫重复出现次数。

所为的匹配多个字符不是说多个匹配多个,而是一个字符后面加上限定符表示出现重复次数在进行匹配
a+ 表示a这个字符至少出现一次或多次
a* 表示a字符可以不出现,也可以出现一次或者多次 ,如 .*来匹配一行内容
a? 表示a字符,出现只能1次,或者不出现,也就是(0或1次)

//以{开始,以}结束,作用于限定符,n是一个非负整数,比如a{1} a必须出现一次,
a{n} 匹配确定的 n 次   如判断用户输入是否是手机号码: \d{11} 这种常用
a{n,} 至少匹配n 次, 或大于n的多次。等价于a*
a{n,m} 最少匹配 n 次且最多匹配 m 次(n<=m)

分组语法正则表达式里每个元括号()就是一组:案例如邮箱判断([a-zA-Z_0-9]{4,20})@(163|126)\.com$

//以(开始,以)结束,作用于表达式,其中 | 类似于if里面的或意思 || 比如(a|b)表示ab任意匹配一个
(exp) 匹配exp,并捕获文本到自动命名的组里
(?<name>exp) 匹配exp,并捕获文本到名称为name的组里
(?:exp) 匹配exp,不捕获匹配的文本
(?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置

(?#comment)注释:这种类型的组不对正则表达式的处理产生任何影响,只是为了提供让人阅读注释

 \ 转义字符,比如字符串中有*号,和正则表达式冲突 需要 \* 转义 如:([^\["\']+?) 表示不能有单引双引号
利用转义字符 \1 作用 如果前面表达式和 后面需要的一样 就用\1指定前面子匹配项 来代替后面的,另外 "\1" 引用第1对括号内匹配到的字符串,"\2" 引用第2对括号内匹配到的字符串……以此类推

列:/<(?#这个是注释)(\w*)><(\w*)>.*</\2></\1>/ 

如果太多的元素,就用取名:<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>

^开始,以$结束 ,作用于字符串,可以单独使用 ^abc以 abc开头, abc$以abc结束   ,如果是 ^abc$   相当于必须匹配是字符串abc

 \b 匹配单词边界 ,不占用字符位置,也就是指一个单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
 \B 匹配非单词边界,表示不匹配单词开头或结束的位置,如:'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。

以上皆为所有语言正则表达式调用特性--------------------------------------------------------------------------------------------------------------------------------------------------------------

在js中的表达式:以/开始,以/结束, 作用于分隔符,表示正则表达式的开始与结束  如:var patrn=/正则表达式主体/参数 可要可不要;     a = str.match(/^(.|\n)+$/); alert(a[0]);结果为整个字符串,a是一个数组

附加参数  g: 全局匹配一行全部 i: 忽略大小写 m 多行查找如果存在\n换行符会使用到 ;另外可以两个字母和在一起如:gi: 全局匹配一行 ,忽悠大小写 ,gm 全局匹配多行   例如: /abc/i 可以匹配 abc、aBC、Abc 

例:var reg=/abc+f/g; 适用于match 也等价于  var reg=new RegExp(“表达式”,”附加参数”);  var reg=new RegExp(“abc+f”,”g”);  这里的RegExp调用对象了解就好 一般不常用

s 特殊字符圆点 . 中包含换行符
默认的圆点 . 是 匹配除换行符 \n 之外的任何单字符,加上s之后, . 中包含换行符
$str = "abggab\nacbs";
$preg = "/b./s";
preg_match_all($preg, $str,$matchs);
print_r($matchs);//Array ( [0] => Array ( [0] => bg [1] => b [2] => bs ) ) 

U 只匹配最近的一个字符串;不重复匹配; 
$mode="/a(.*?)c/";
$preg="/a.*c/U";//这两个正则返回相同的值
$str="abcabbbcabbbbbc" ;
preg_match($mode,$str,$content);   echo $content[0];//abc
preg_match($preg,$str,$content);   echo $content[0];//abc
//修正符:x 将模式中的空白忽略; 
//修正符:A 强制从目标字符串开头匹配;
//修正符:D 如果使用$限制结尾字符,则不允许结尾有换行; 
//修正符:e 配合函数preg_replace()使用, 可以把匹配来的字符串当作正则表达式执行; 
正则表达式在js里有这么几个方法可以执行:
exec 一个在字符串中执行查找匹配的RegExp方法,它返回一个数组(未匹配到则返回 null 如果匹配完字符串一遍后没有将lastIndex属性重置为0 则下一次匹配也会返回null,因为索引会一直延续下去) 语法:var 变量 = 正则表达式.exec(字符串)
注意:exec如果在一个字符串中完成了一次模式匹配之后要开始检索新的字符串,就必须手动地把 lastIndex 属性重置为 0。 /正则表达式/.lastIndex = 0;再将该模式应用到新的字符串。
test 一个在字符串中测试是否匹配的RegExp方法,它返回 true 或 false。 语法:var 变量 = 正则表达式.test("字符串")
match一个在字符串中执行查找匹配的String方法,它返回一个数组,在未匹配到时会返回 null。语法: var 变量 = 字符串.match(/正则表达式/)
matchAll一个在字符串中执行查找所有匹配的String方法,它返回一个迭代器(iterator)。 在js没有这个方法 ,都是其他语言会用到了解一下。
search 一个在字符串中测试匹配的String方法,它返回匹配到的位置索引,或者在失败时返回-1。和match理解一样,只是search 不需要从头开始匹配,在字符串了只要有符合的,就是他的开始匹配位置
replace一个在字符串中执行查找匹配的String方法,并且使用替换字符串替换掉匹配到的子字符串。返回替换后一个新字符串。语法:var 变量 = 字符串.replace(/正则表达式/,"提供给匹配到正则表达式所替换的内容")
split一个使用正则表达式或者一个固定字符串分隔一个字符串,并将分隔后的子字符串存储到数组中的 String 方法,作用就是分割字符串返回的是分割后的数组。
语法: var 变量 = 字符串.split(/正则表达式/)

汉字:^[\u4e00-\u9fa5]{0,}$

密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$ 按常理说应该是对的 但是要慎用, 前面说的\w 其他国家我语言文字如中国汉字依然可以匹配

//校验是否全由数字组成
function isDigit(s) { var patrn=/^[0-9]{1,20}$/; if (!patrn.exec(s)) return false return true }

 

JavaScript表单验证email,判断一个输入量是否为邮箱email,通过正则表达式实现。
//检查email邮箱

 function isEmail(str){
       var reg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/;
       return reg.test(str);
}

//校验登录名:只能输入5-20个以字母开头、可带数字、“_”、“.”的字串
function isRegisterUserName(s) { var patrn=/^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){4,19}$/; if (!patrn.exec(s)) return false return true } 

//校验用户姓名:只能输入1-30个以字母开头的字串
function isTrueName(s) { var patrn=/^[a-zA-Z]{1,30}$/; if (!patrn.exec(s)) return false return true } }} //校验密码:只能输入6-20个字母、数字、下划线 [code] function isPasswd(s) { var patrn=/^(\w){6,20}$/; if (!patrn.exec(s)) return false return true } 

//校验普通电话、传真号码:可以“+”开头,除数字外,可含有“-”
function isTel(s) { //var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?(\d){1,12})+$/; var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/; if (!patrn.exec(s)) return false return true } 

//校验手机号码:必须以数字开头,除数字外,可含有“-”
function isMobil(s) { var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/; if (!patrn.exec(s)) return false return true }

//校验邮政编码
function isPostalCode(s) { //var patrn=/^[a-zA-Z0-9]{3,12}$/; var patrn=/^[a-zA-Z0-9 ]{3,12}$/; if (!patrn.exec(s)) return false return true } 

//校验搜索关键字
function isSearch(s) { var patrn=/^[^`~!@#$%^&*()+=|\\\][\]\{\}:;'\,.<>/?]{1}[^`~!@$%^&()+=|\\\] [\]\{\}:;'\,.<>?]{0,19}$/; if (!patrn.exec(s)) return false return true } function isIP(s) //by zergling { var patrn=/^[0-9.]{1,20}$/; if (!patrn.exec(s)) return false return true }

\cx 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。 x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。

\f 匹配一个换页符。等价于 \x0c 和 \cL。

\n 匹配一个换行符。等价于 \x0a 和 \cJ。

\r 匹配一个回车符。等价于 \x0d 和 \cM。

\t 匹配一个制表符。等价于 \x09 和 \cI。

\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。

\xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如, '\x41' 匹配 "A"。'\x041' 则等价于 '\x04' & "1"。正则表达式中可以使用 ASCII 编码。.

\num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匹配两个连续的相同字符。

\n 标识一个八进制转义值或一个后向引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为后向引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。

\nm 标识一个八进制转义值或一个后向引用。如果 \nm 之前至少有is preceded by at least nm 个获取得子表达式,则 nm 为后向引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。

\nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。

\un 匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。

 

posted @ 2019-12-17 11:25  Akai_啊凯  阅读(293)  评论(0编辑  收藏  举报