<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Expression.html</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=GB18030">
<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
<script type="text/javascript">
function check(){
var t = txt.value;
alert(t);
var exp = /[A-C]{3,5}[a-c]{3}[1-3]{3}/;
var objExp = new RegExp(exp);
if(objExp.test(t)==true){
alert('ok');
}else{
alert('untrue');
}
}
function check2(){
//注意这里省略掉了new RegExp(),因为大家知道JS的类型是自动确定的,所以当写/**/时,变量就是RegExp对象
//匹配1111,或2222等任意4个相同的数字
/////(\d\d)的复制品就是\1,第一个()括号就是\1,依次类推,所以这里匹配4个一样的数字,前面两个数字,后面是一个复制品,
var t = txt.value;
alert(t);
var exp = /(\d\d)\1/;
if(exp.test(t)==true){
alert('ok');
}else{
alert('untrue');
}
}
function check3(){
//匹配千位和个位相同,百位和十位相同,如1221,5665等
/////(\d\d)的复制品就是\1,第一个()括号就是\1,依次类推,所以这里匹配4个一样的数字,前面两个数字,后面是一个复制品,
var t = txt.value;
alert(t);
var exp = /(\d)(\d)\2\1/;
if(exp.test(t)==true){
alert('ok');
}else{
alert('untrue');
}
alert("RegExp.$2="+RegExp.$2);//注意了,RegExp是对象,JS中只有对象,没有类
alert("RegExp.$_="+RegExp.$_);//注意了,RegExp是对象,JS中只有对象,没有类
}
function check4(){
//关于RegExp的实例的两种方法得到,还是觉得第二种好
//都是匹配原义字符\,第二种一看就明白,第一种的话,前面两个\\表示\,后面两个\\表示\,加起来就是\\
var t = txt.value;
alert(t);
var objExp = new RegExp("\\\\");//第一种
alert(objExp);
var objExp2 = new RegExp(/\\/);//第二种
alert(objExp2);
if(objExp.test(t)==true){
alert('ok');
}else{
alert('untrue');
}
}
function check5(){
//exec方法测试
//exp.lastIndex在FF中的结果是0,在IE中是8,原因由g标志引起
var t = "aaa 111 bbb 222 ccc 333 111 dddd";
var exp =/111/;
var arr = exp.exec(t);
if(arr){
alert(arr.length+'\n'+arr.index+'\n'+exp.lastIndex);
}else{
alert('untrue');
}
}
function check6(){
//exec方法测试
//指定了g标志,IE和FF的结果是一样的
var t = "aaa 111 bbb 222 ccc 333 111 dddd";
var exp =/111/g;
var arr = exp.exec(t);
if(arr){
alert(arr.length+'\n'+arr.index+'\n'+exp.lastIndex);
}else{
alert('untrue');
}
}
function check7(){
//此方法说明$*属性是一个静态属性,在方法3中赋值,在这里还可以用,测试时,点一下测试3,再点测试7就可以得到结果
alert("RegExp.$2="+RegExp.$2);//注意了,RegExp是对象,JS中只有对象,没有类
alert("RegExp.$_="+RegExp.$_);//注意了,RegExp是对象,JS中只有对象,没有类
alert("RegExp.input="+RegExp.input+'\n证明.input等价于.$_');//注意了,RegExp是对象,JS中只有对象,没有类
}
function check8(){
var t = "a1bc3de4f";
var exp =/([a-z])([0-9])([a-z])/g;
var arr ;
while( ( arr = exp.exec(t) ) != null){
alert(arr.length+'\narr[0]='+arr[0]+'\narr[1]='+arr[1]);
//arr[0]是要找的字符串(这里要找的字符串就是1个字母1个数字然后又一个字母),arr[1]就是第一个子匹配(就是第一个括号里面的值)
}
}
function check9(){
var t = "a1bc3de4f";
var exp =/^a1/;
if(exp.test(t)){//以a1开头
alert('ok');
}else{
alert('untrue');
}
if( (/4f$/).test(t)){//以4f结尾
alert('2ok');
}else{
alert('2untrue');
}
//边界符,想想什么是边界符,我是民工
t = "i am a coding";
exp = /ing\b/;
if(exp.test(t)){
alert('3ok');
}else{
alert('3untrue');
}
if( (/am\b/).test(t)){
alert('4ok');
}else{
alert('4untrue');
}
//其实边界符就是到我这为止,比如/am\b/意思就是am到边界了,因为后面是空格当然到边界了,还有ing后面都没有字符了,当然也到边界了,这样好理解吧
}
function check10(){
//上面用的是单边,现在用双边,双边就是前后都是空格了,或者是开头结尾了
//找连续重复的字符串,思路找一个字符串,然后用空格和此字符串匹配就可以了,这是自己写的,书上写的例子通不过,所以自己写了半天,想了这个笨方法
var t = "Is is the cost of of gasoline going upup?";
var exp2 = new RegExp(/\b([a-z]+)\b( \1)/gi);
if(exp2.test(t)){
alert(RegExp.$1);
alert('5ok');
}else{
alert('5untrue');
}
}
function check_1(){
var t = "aaa 111 bbb 222 ccc 333 111 dddd";
var exp =/\d\d\d/g;
var arr = t.match(exp);
if(arr){
alert("返回数组为:"+arr+"\n返回需要的字符串个数为:"+arr.length+'\n第二个为:'+arr[1]);
}else{
alert('untrue');
}
}
function check_2(){
var t = "aaa 111 bbb 222 ccc 333 111 dddd";
var exp =/\d\d\d/g;
var postion = t.search(exp);
alert("因为位置是从0开始算的,所以返回找到字符串的位置为:"+postion);
}
function check_3(){
var str = "湖南省,浙江省,福建省,四川省";
var arr = str.split(",");
var s ;//这里必须赋空值,要不然下面的赋值会出现未定义的警告
//var s = '';//应该这样写
for(var i in arr){
//注意这里和java的新特性有点一样,但有很大区别,这里的i就是0..n,而java的是arr里面的元素,所以这里取元素得arr[i]这样取
s = s + arr[i]+'\n';
}
alert(s);
}
function check_4(){
var str = "a12b34c56";
var exp = /(\d)(\d)/;
//var exp = /(\d)(\d)/g;//应该加全局标志
var str2 = str.replace(exp,"$2$1");
alert("处理后源字符串并不变:"+str+"\n这是返回的一个新的字符串"+str2);
}
</script>
</head>
<body>
<p>正则表达式学习.正则表达式以/开始,以/结尾.
<p>正则表达式的功能,三个:匹配,查找,替换
<p>RegExp对象勿需new,当然也可以new了, 当写两个//时会自动识别为RegExp对象,因此就可以用其方法了,常用方法如:正则表达式.test(源字符串),返回结果为真假
<p>正则表达式.exec(源字符串):搜索用,在源字符串搜索你想要的字符串(比如/\d{2}/就是想要的连续2个数字);当找到想要的字符串时会返回一个数组(注意:这个数组的元素有点怪,第一个元素就是你要找的字符串,后面的元素为子匹配,看一下测试8的代码就好理解了),否则返回null;
<hr>
<input type="text" id="txt"><hr>
<input type="button" value="测试1" onclick="check()">测试ABCabc123,当然AAAbbb111也对<hr>
<input type="button" value="测试2" onclick="check2()">测试1111,4个一个样的数字<hr>
<input type="button" value="测试3" onclick="check3()">测试1221,千个位相同,百十位相同<hr>
<input type="button" value="测试4" onclick="check4()">测试\,<hr>
<input type="button" value="测试5" onclick="check5()">exec方法测试,没指定g标志,IE和FF的结果不一样<hr>
<input type="button" value="测试6" onclick="check6()">exec方法测试,指定了g标志,IE和FF的结果是一样的<hr>
<input type="button" value="测试7" onclick="check7()">此方法说明$*属性是一个静态属性,在方法3中赋值,在方法7还可以用,测试时,点一下测试3,再点测试7就可以得到结果,<br>证明.input等价于.$_<hr>
<input type="button" value="测试8" onclick="check8()">exec方法测试,返回子匹配<hr>
<input type="button" value="测试9" onclick="check9()">定位符^$的用法及边界符用法<hr>
<input type="button" value="测试10" onclick="check10()">定位符^$的用法及边界符用法<hr>
<hr>String方法简介<br>
match(RegExp)方法可以传RegExp对象,match方法和RegExp的方法差不多,写法是相反的;源字符串.(正则表达式对象);<br>
search()方法返回找到的位置 <br>
split()方法以特定字符分割源字符串
replace(RegExp,"替换为")方法返回一个新的字符串,注意原字符串并不变 <br><hr>
<input type="button" value="测试_1" onclick="check_1()">mathch()方法测试,源字符串:"aaa 111 bbb 222 ccc 333 111 dddd";正则表达式:/\d\d\d/就是找连续三个数字的字符串,(注意,这里的源字符串的空格本来是两个的,这里只是个表示而已,真正的源字符串看方法里面的)<hr>
<input type="button" value="测试_2" onclick="check_2()">search()方法测试,源字符串:"aaa 111 bbb 222 ccc 333 111 dddd";正则表达式:/\d\d\d/就是找连续三个数字的字符串,(注意,这里的源字符串的空格本来是两个的,这里只