正则表达式(JS & PY 实现)

 ■ 什么是 正则表达式 ?
 
正则表达式不属于某个编程语言,正则表达式是一门独立的知识。它在所有编程语言中都通用。
 
正则表达式可理解为“规律表达式”,找到你想要的字符串的规律 并表述出来,就是正则表达式。
 
★ 正则表达式 的作用:描述字符串的规律。
 
★ 创建正则表达式的口诀:
  从哪里开始找?(定位符、元字符:\b \B)
  找什么?(字符)
  找几个?(限定符)
 
 
 ■ 在 JavaScript 中使用正则表达式:
 
例如:
var myReg = /\d{4}/gi;
var myReg = /[a-z]+[0-9]+/;
var myReg = /([a-z]+[0-9]+)+/;     //★ 小括号 ( ) 用于定义子表达式
 
 
 ■ JS 中创建正则表达式的一般形式:
 
①var regExp = /正则表达式内容/gi; //隐式创建
 
②var regExp = new RegExp(正则表达式内容,"gi"); //显示创建
 
修饰符:
i 执行对大小写不敏感的匹配。
g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
m 执行多行匹配(把字符串的每一行都看作一条独立的字符串)。
 
s 单行模式,即 无视字符串中的换行,把整条字符串当成一行来处理。
(注意:JavaScript 不支持单行模式,但 PHP 支持。)
 
 
 ■ JS 中正则表达式对象的方法:
 
① exec方法
作用:
根据 正则表达式 检索 字符串 中匹配的值。
如果在字符串中找到匹配的值,就返回该匹配值。
如果没有找到任何匹配的值,就返回 null 。
例如:
var patt = /Hello/g; //创建正则表达式。
var str = 'Hello World';
var rt = patt.exec(str);
alert(rt);
 
② test方法
作用:
根据 正则表达式 检索 字符串 中匹配的值。
如果在字符串中找到匹配的值,就返回 true ,否则返回 false 。
例如:
var patt = /Hello/g; //创建正则表达式。
var str = 'Hello World';
var rt = patt.test(str);
alert(rt);
 
 
 ■ JS 中字符串对象与正则表达式相关的方法:
 
① search方法
作用:
在 字符串 中检索与 正则表达式 匹配的值。
如果找到匹配的值,就返回相对位置。
如没有找到任何匹配的值,就返回 -1 。
例如:
var patt = /Hello/g; //创建正则表达式。
var str = 'Hello World';
var rt = str.search(patt); 
alert(rt);
 
② match方法
作用:
在 字符串 中检索与 正则表达式 匹配的值。
如果找到匹配的值,就返回一个数组,其中存放了它找到的匹配值的相关内容。
如果没有找到任何匹配的值,就返回 null 。
例如:
var patt = /Hello/g; //创建正则表达式。
var str = 'Hello World';
var rt = str.match(patt);
alert(rt);
 
③ replace方法
作用:
把 字符串 中与 正则表达式 匹配的值替换为新的内容。
返回替换新内容后的字符串。
例一:
var patt = /Hello/g; //创建正则表达式。
var str = 'Hello World';
var new_str = str.replace(patt,字符串);
 
例二,利用 正则表达式(反向捕获)把手机号码的中间4个数字替换为*号:
var patt = /([0-9]{3})[0-9]{4}([0-9]{4})/;
var number = '13523622989';
number = number.replace(patt,"$1****$2"); // ★注意:这里要用到 反向捕获 ,并且用 $ 代替 \ 。
 
例三,清除网页代码中的 script 代码:
var patt = /<script[\w\W]+?<\/script>/gi;
var webcode = "网页代码";
webcode = webcode.replace(patt,'');
 
④ split方法
作用:
根据与 正则表达式 匹配的值,把字符串分割为数组。
返回字符串分割后的数组。
例如:
var patt = /Hello/g; //创建正则表达式。
var str = 'Hello World';
var arr = str.split(patt,3);
 
 ★ 小括号 ( ) 用于定义子表达式。
 
 ★ 反向捕获:
例如,要找四位数,第一位与第四位相同,第二位与第三位相同,如9889。
则正则表达式为: var patt = /(\d)(\d)\2\1/gi;
注意:
\1 代表第一个小括号中的内容。
\2 代表第二个小括号中的内容。
 
 
 ■ 限定符(量词):
{出现次数}
{3,4} //出现3或4次。★JS默认使用贪婪匹配模式,即尽可能匹配最多的内容。
{3,} //出现最少3次,最多可以无限次。
 
+ //表示出现1次到任意多次,等效于 {1,} 。
* //表示出现0次到任意多次,等效于 {0,} 。
? //表示出现0次到1次,等效于 {0,1} 。
 
 ★ 注 意 :
  JavaScript 中( Python 也一样)正则表达式 的默认匹配模式是:尽可能匹配最多的内容,这种匹配模式称为“贪婪模式”。
  只需要在 限定符 后加上 ? 问号,就可以将匹配模式改为“非贪婪模式”了,例如:
  a.*b   是 匹配 以a开始,以b结束 的字符串。如果把它应用于 aabab 的话,由于默认是“贪婪模式”它会匹配 aabab 。
  a.*?b  是 匹配最短的 以a开始,以b结束 的字符串。如果把它应用于aabab的话,它会匹配 aab 和 ab 。
 
 
 ■ 字符匹配符(中括号):
[a-z] //表示可以匹配a-z中任意一个字符。
[A-Z] //表示可以匹配A-Z中任意一个字符。
[0-9] //表示可以匹配0-9中任意一个字符。
[abcd] //表示可以匹配abcd中任意一个字符。
 
[^a-z] //表示可以匹配不是a-z中的任意一个字符。
[^A-Z] //表示可以匹配不是A-Z中的任意一个字符。
[^0-9] //表示可以匹配不是0-9中的任意一个字符。
[^abcd] //表示可以匹配不是abcd中的任意一个字符。
 
 
 ■ 元字符:
\d 相当于 [0-9]
\D 相当于 [^0-9]
 
\w 相当于 [a-zA-Z0-9_]
\W 相当于 [^a-zA-Z0-9_]
 
\s 匹配任何空白字符(包括空格,制表符 即Tab 等)。
\S 匹配任何非空白字符。
 
\b 查找位于单词的开头或结尾的匹配,即 \bis\b 就代表 is 是独立的一个单词。
\B 查找不处在单词的开头或结尾的匹配,即 \Bis\b 就代表 is 不是一个独立的单词,有可能是 this 的最后两个组成字母。
 
 .  匹配除了\n(换行符)之外的任意一个字符。如果想匹配“.”要使用转意字符 \.
 
 ★ 注 意 :
  因为 . 不能代表换行符,而且在 JavaScript 中( Python 也一样)没有“单行模式”。
  所以在JS(或 PY )中,当我们需要匹配一个包含换行符的任意字符时,无法通过 . 实现。
  解决方法:可以用 [\d\D] [\w\W] [\s\S] 代表包含换行符的任意字符
 
  在 Pyhton 中 还可以通过 .*? re.S 修饰符 代表 一切无限多的字符 (这是 PY 中 正则 的 惯用法)。
 
 
 ■ 定位符:
^ 匹配开始位置,例如 /^abc/gi 代表字符串是以 abc 开头的。
$ 匹配结束位置,例如 /xyz$/gi 代表字符串是以 xyz 结尾的。
 
 
 ■ 选择匹配符(或):
| 例如:/a|b|c/gi 就表示 可以是a或b或c其中之一。
 
 
 ★ 匹配中文:
 
\un 其中n代表一个用4个十六进制数字表示的 Unicode 字符。
例如:\u3000 表示中文全角空格。
 
在 Unicode 编码中,中文对应的范围是 4e00 - 9fa5 。
所以,我们可以通过以下正则表达式匹配所有中文字符:
 
var patt = /[\u4E00-\u9FA5]/g;
 
 
  预 查 :
 
预查 就是预先查看后续的字符。预查是“非获取匹配”,即 该匹配不需要获取供以后使用。
 
预查不消耗字符。即 接下来的匹配 并不是从 预查结束的位置 开始,而是从 预查开始的位置 继续匹配。
 
打一个生动的比喻:
 
目的地在前方200米。
当你走到100米时,停了下来。你用望远镜向前看,看到了目的地。
此时,虽然你看到了目的地,但你依然停留在100米的地方。
 
☆ 预查 只是用『望远镜』向前看一下。
 
 
例一,要求找进行时的单词的词根部分:
 
var str = document.getElementsByName('str')[0];
 
var patt = /\b\w+(?=ing)/g;
 
alert(str.value.match(patt));
 
例二,要求找不是进行时的单词:
 
var str = document.getElementsByName('str')[0];
 
var patt = /\b\w+(?!ing)\w{3}\b/g; // 高!
 
alert(str.value.match(patt));
 
 
 ■ 实用案例:
 
1.验证手机号码:
 
var tel = document.getElementsByName('tel')[0];
 
var patt = /^1[34578]\d{9}$/;
 
if(patt.test(tel.value)){
alert('是手机号');
}else{
alert('不是手机号');
}
 
2.采集手机号码:
 
var article = '文章内容';
 
var patt = /1[34578]\d{9}/g;
 
alert(article.match(patt));
 
3.验证 email :
 
var email = document.getElementsByName('email')[0];
 
var patt = /^[a-z0-9]\w*(\.[a-z0-9]+)*@[a-z0-9][a-z0-9-]*(\.[a-z0-9][a-z0-9-]*)+$/i;
 
if(patt.test(email.value)){
alert('是 email');
}else{
alert('不是 email');
}
 
4.清除网页代码中的 script 代码:
 
var webcode = "网页代码";
 
var patt = /<script[\w\W]+?<\/script>/gi;
 
webcode = webcode.replace(patt,'');
 
5.把手机号码的中间4个数字替换为*号:
 
var patt = /(\d{3})\d{4}(\d{4})/;
 
var number = '13523622989';
 
number = number.replace(patt,"$1****$2"); // ★注意:这里要用到【反向捕获】,并且用 $ 代替 \ 。
 
6.清除重复字符:
 
var str = 'aaabbbccc';
 
var patt = /([\w\W])\1+/g;
 
str = str.replace(patt,'$1');
 
7.清楚中文字符:
 
var str = 'Hello 世界';
 
var patt = /[\u4E00-\u9FA5]/g;
 
str = str.replace(patt,'');
 
8.检验用户名,要求只能由 字母、数字、下划线、中文 组合而成,并且字符个数至少为4:
 
var usname = document.getElementsByName('username')[0];
 
var patt = /^[\w\u4E00-\u9FA5]{4,}$/;
 
if(patt.test(usname.value)){
alert('用户名有效');
}else{
alert('用户名无效');
}

 

posted @ 2017-11-10 20:48  Uncle_Jay  阅读(181)  评论(0编辑  收藏  举报