【学习笔记】正则表表达式
正则表达式是一种定义字符模式的方法,我们可以拆分,查找或替换字符串中与模式字符匹配的字符。
在javascript之外,正则表达式也是很有用的。
在javascript中,正则表达式是通过RegExp对象使用的,RegExp对象是javascript中的一个内置对象,与String类似。
创建RegExp对象:
可以通过两种方式创建新的RegExp对象。
使用正则表达式字面值:
如
var myregexp=/\b'|'\b/ig;
使用RegExp对象的构造函数RegExp():
var myregexp=new RegExp("\\b'|'\\b","ig");
使用这种方法的一个非常重要的区别是如果使用特殊的正则表达式字符,如\b,这些字符前有一个反斜杠/,在javascript中,反斜杠表示一个转义字符,如果\b表示退格,为了区分\b是字符串中的转义字符,还是正则表达式中的特殊字符,必须在字符前再加一个反斜杠。因此\b就变成\\b。
上述两种指定正则表达式的方法都可行。一般建议用第一种,而使用第二种的原因是它允许在运行其间确定正则表达式。例如,正则表达式需要以用户的输入为基础时,就用第二种方式。
RegExp对象有自己的方法和属性。如test()方法可测试传入的参数字符串是否匹配RegExp对象中定义的模式。
RegExp对象默认仅查找与模式匹配的第一个字符串,这是RegExp对象的一个重要而常见的特性。正则表达式从字符的一端开始查找,当找到第一个匹配字符串时,就停止查找。
RegExp对象的方法:
test()方法:
检测所传入的参数字符串,确定传入的参数是否与定义的RegExp对象正则语法匹配,如果匹配,则返回true,否则返回false。
RegExp对象属性:
- g:全局匹配,查找所有与模式匹配的字符串,而不是在找到第一个匹配的字符串后就停止。
- i:模式不区分大小写,如将A和a都视为相同的字符模式。
如:
var myregexp=/\b'|'\b/gi;
则执行全局查找并忽略大小写。
正则表达式特殊字符:
1,文本,数字和标点符号:
\d:0~9的任何数字。如:\d\d将匹配72,但不匹配aa,7a,只匹配两个都为数字的字符。
\D:任何非数字字符。如\D\D\D匹配abc,但不匹配123或8ef,值匹配三个都不为数字的字符。
\w: 任何单词字符,即A ~ Z,a~z,0~9以及下划线(_)字符。如\w\w\w\w匹配Ab_2,但不匹配&%*或Ab_@。
\W: 任何非单词字符,如\W匹配@,但不匹配a。
\s: 任何空白字符。如\s匹配制表符,回车符,换页符和竖杆。
\S: 任何非空白字符。\S匹配A,但不匹配制表符。
.:除换行符(\n)之外的任意单个字符。.匹配a或4,或@。
[...]:匹配位于方括号之内的任何一个字符,[a-z]将匹配在a~z范围内的任何字符。如[abc]匹配a,b,c但不匹配任何其他字符。
[^...]:匹配方括号之外的任何字符。如[abc]将匹配a,b,c之外的任何字符。[^a-z]将匹配除了a~z之外的任何字符。
<form action="#" name="form1"> <input type="text" name="txt"> <input type="button" value="测试" name="btn" onclick="check()" > </form> <script> function reg(txt){ var myreg=/[^a-z\d ]/i; return !(myreg.test(txt)); } function check(){ if(reg(document.form1.txt.value)==true){ alert("有效"); }else{ alert("无效") } } </script>
函数接收一个参数,即要检查有效性的文本,设置一个正则表达式并赋值给变量myreg,这就将隐式地创建一个新的RegExp对象。该正则表达式:
a-z匹配从a到z的任意字符。
\d表示匹配任何数字字符,即0到9。
空格
[^]表示要匹配括号外的任意字符。
i表示该模式不区分大小写。
综上,该表达式不匹配空格,a~z,A~Z和0~9之间的字符。
如:
1-800-889-5475
\d-\d\d\d-\d\d\d-\d\d\d\d
2,重复字符。
用于指定要匹配多少个前一项或字符。
{n}:前一项出现n次。如x{2}与xx匹配,x出现两次。
{n,}:前一项出现n次,或者n次以上。如x{2,}匹配xx,xxx,xxxx,xxxxx等。
{n,m}:前一项至少出现n次,最多出现m次。x{2,4}匹配xx,xxx和xxxx。
{n,m}:前一项至少出现n次,最多出现m次。x{2,4}匹配xx,xxx和xxxx。
?:前一项出现0次或1次。如x?匹配空字符串或x。
+:前一项出现1次或多次。如x+匹配x,xx,xxx,xxxx,xxxxx等。
*:前一项出现0次或多次。如x*匹配空字符串,或x,xx,xxx等。
如:
1-800-889-5475
\d-\d\d\d-\d\d\d-\d\d\d\d
\d-\d{3}-\d{3}-\d{4}
3,位置字符:
指定匹配从哪里开始或结束,或者哪些字符位于字符模式的某一端。
^:模式必须位于字符串的开头,如果是多行字符,模式就位于一行的开头.
$:,模式必须位于字符串的结束位置。如果是多行字符串,模式就位于一行的结束位置。
\b:匹配单词分界位置,即单词字符与非字符之间的位置。
\B:匹配非单词分界位置。
如:
^rose
这将与一行开头的rose匹配。
就在一行的结尾匹配该模式
rose$。
单词分界。
任何单词字符(字母,数字或下划线字符)之间的位置以及任何非单词字符都是单词的分界,另外,字符串的开始或结束位置与单词字符之间的边界也是单词分界。
var mystr="my name's rose! and my old's 50_50 or 30?"; var my=/\b/g; alert(mystr.replace(my,"|"))
正则表达式分组:
如果要将多个表达式处理为一个组,只需将它们放在圆括号中,如/(\d\d)/
重用字符组:
可以在表达式中重用一组字符指定的模式。要引用起前面的字符组,只需引入\和表示分组顺序的数字即可。例如,第一个分组可引用为\1。
使用Regexp对象的构造函数: