js正则表达式

 

转载 :http://www.jb51.net/article/43190.htm

http://www.iteye.com/topic/481228/

正则表达式需要学习的方法:

.  这个表示除了\n以外的任何数据,他和*+?都不同,后边的几个都是表示数量。而.表示字符。

* 匹配前面元字符0次或多次,/ba*/将匹配b,ba,baa,baaa 
+ 匹配前面元字符1次或多次,/ba*/将匹配ba,baa,baaa 
? 匹配前面元字符0次或1次,/ba*/将匹配b,ba 
(x) 匹配x保存x在名为$1...$9的变量中 
x|y 匹配x或y 
{n} 精确匹配n次 
{n,} 匹配n次以上 
{n,m} 匹配n-m次 
[xyz] 字符集(character set),匹配这个集合中的任一一个字符(或元字符) 
[^xyz] 不匹配这个集合中的任何一个字符 

\w 匹配一个字母数字下划线

\W 匹配一个不可以组成单词的字符,如[\W]匹配"$5.98"中的$,等于[^a-zA-Z0-9]

\d 匹配一个字数字符,/\d/ = /[0-9]/ 

\D 匹配一个非字数字符,/\D/ = /[^0-9]/ 
\n 匹配一个换行符 
\r 匹配一个回车符 
\s 匹配一个空白字符,包括\n,\r,\f,\t,\v等 
\S 匹配一个非空白字符,等于/[^\n\f\r\t\v]/ 

这个exex方法用的我至今还是理解不了,以后有大牛的话问问吧,为什么,不能a,f,h,j一个一个匹配。

js中字符串的函数可以使用正则几个match、exec、test、search、replace、split

test,exec是正则点字符串

match.replace是字符串点正则

test

exec

var str = "Visit W3School, W3School is a place to study web technology."; 
var patt = new RegExp("W3School","g");
var result;

while ((result = patt.exec(str)) != null)  {
  document.write(result);
  document.write("<br />");
  document.write(patt.lastIndex);
  document.write("<br />");
 }
结果:
W3School
14
W3School
24

 

match 返回找到的数组

例子 1<script type="text/javascript">

var str="Hello world!"
document.write(str.match("world") + "<br />")
document.write(str.match("World") + "<br />")
document.write(str.match("worlld") + "<br />")
document.write(str.match("world!"))

</script>
输出:
world
null
null
world!
例子2:
<script type="text/javascript">

var str="1 plus 2 equal 3"
document.write(str.match(/\d+/g))

</script>
结果:
1,2,3

 

replace

------------------------------------

var pattern = /Box/i;

var str = 'This is a Box!That is a Box';

alert(str.replace(pattern,'Tom'))

-------------------------------

search(找到即返回,不需要g,找不到,返回-1)

split

"hello worlld".split("ll").join("kk")

静态变量

var pattern =/(g)oogle/ig;

var str = 'This is a google';

pattern.test(str);

alert(RegExp.input);

alert(RegExp.leftContext);

alert(RegExp.rightContext);

alert(RegExp.lastMatch);

alert(RegExp.lastParen);

alert(RegExp.multiline);

 

匹配模式:

var pattern = /google/;

var str = 'google google google';

pattern.global;//如果有g的话,那么true

pattern.ignoreCase;//如果有i的话,那么true

pattern.multiline;//如果有m的话,那么true

pattern.source;//"google"

patter.test(str);

patter.test(str);

pattern.lastIndex;//13 这个值还可以手动设置

 

var pattern = /go{2,4}gle/;//o{2,4}表示匹配o2-4次,包含2和4

var str = 'google';

pattern.test(str);//true

 

var pattern =/goo\sgle/;   //ls表示空格

var pattern = /google\b/; //\b表示达到边界

var  str ='google';

alert(pattern.test(str));

var pattern = /google|baidu|bing/;

var str = 'this is bing';

pattern.test(str);

var pattern = /google{4,8}$/;//表示e的4-8次

var pattern = /(google){4,8}$/

 

var pattern = /8(.*)8/;

var str = 'This is a 8google8';

pattern.test(str)

console.log(RegExp.$1);

//RegExp表示获取模式中第一个分组对应的字符串

实际运用 

var pattern = /8(.*)8/

var str = 'This is a 8google8';

document.write(str.replace(patter,'<strong>$1</strong>'));

var pattern = /(.*)\s(.*)/;
var str = 'google baidu';
var result = str.replace(pattern, '$2 $1'); //将两个分组的值替换输出 document.write(result); 

 

贪婪与非贪婪

 

 

/*关于贪婪和惰性 */
var pattern = /[a-z]+?/;    //?号关闭了贪婪匹配,只替换了第一个

var str = 'abcdefjhijklmnopqrstuvwxyz'; 

var result = str.replace(pattern, 'xxx');

alert(result); //"xxxbcdefjhijklmnopqrstuvwxyz"

-------------------

?导致了(.+)的第一次命中就停止,然后开始第二次的。

---------------------

var pattern = /8([^8]*)8/g; //另一种禁止贪婪

var str = 'This is 8google8, That is 8google8, There is 8google8';

var result = str.replace(pattern,'<strong>$1</strong>');

document.write(result); 

//"This is <strong>google</strong>, That is <strong>google</strong>, There is <strong>google</strong>"

---------------------

/*使用 exec 返回数组*/

var pattern = /^[a-z]+\s[0-9]{4}$/i;

var str = 'google 2012';

alert(pattern.exec(str)); //返回整个字符串 

------------------------

var pattern = /^[a-z]+/i;//只匹配字母 

var str = 'google 2012';

alert(pattern.exec(str)); //返回 google 

-------------------------

var pattern = /^([a-z]+)\s([0-9]{4})$/i;

var str = 'google 2012';

alert(pattern.exec(str)[0]);//google 2012 

alert(pattern.exec(str)[1]);//google

alert(pattern.exec(str)[2]); //2012

--------------------------

分组和不分组匹配的区别

 

--------------------------

/*捕获性分组和非捕获性分组 */

var pattern = /(\d+)([a-z])/;//捕获性分组 

var str = '123abc';

alert(pattern.exec(str)); //123a,123,a

--------------------------

var pattern = /(\d+)(?:[a-z])/;//非捕获性分组

var str = '123abc';

alert(pattern.exec(str)); //123a,123

------------------------------------------

/*使用分组嵌套 */
var pattern = /(A?(B?(C?)))/;//从外往内获取 

var str = 'ABC';

alert(pattern.exec(str)); ABC,ABC,BC,C

-----------------------------------------

/*使用前瞻捕获 */
var pattern = /(goo(?=gle))/;//goo 后面必须跟着 gle 才能捕获 

var str = 'google';

alert(pattern.exec(str)); 

-----------------------------------------

/*使用特殊字符匹配 */

var pattern = /\.\[\/b\]/;

var str = '.[/b]';

alert(pattern.test(str)); //特殊字符,用\符号转义即可 

-----------------------------------------

/*使用换行模式 */
var pattern = /^\d+/mg;//启用了换行模式 

var str = '1.baidu\n2.google\n3.bing';

var result = str.replace(pattern, '#');

alert(result); 

1.检查邮政编码

//共 6 位数字,第一位不能为 0 


var pattern = /[1-9][0-9]{5}/;

var str = '224000';

alert(pattern.test(str)); 

2.检查文件压缩包
var pattern = /[\w]+\.zip|rar|gz/;//\w 表示所有数字和字母加下划线 

var str = '123.zip';//\.表示匹配.,后面是一个选择 

alert(pattern.test(str)); 

3.删除多余空格
var pattern = /\s/g;
var str = '111 222 333';
var result = str.replace(pattern,'');

//把空格匹配成无空格 

4.

4.删除首尾空格
var pattern = /^\s+/;//强制首 
varstr=' goo gle'; 

var result = str.replace(pattern, '');

pattern = /\s+$/;//强制尾 

result = result.replace(pattern, '');

alert('|' + result + '|'); 

alert(result); 

var pattern = /^\s*(.+?)\s*$/;//使用了非贪婪捕获
var str = ' google '; alert('|' + pattern.exec(str)[1] + '|');

var pattern = /^\s*(.+?)\s*$/;//使用了分组获取 
var str = ' google '; alert('|' + str.replace(pattern, '$1') + '|');

5.简单的电子邮件验证
var pattern = /^([a-zA-Z0-9_\.\-]+)@([a-zA-Z0-9_\.\-]+)\.([a-zA-Z]{2,4})$/; var str = 'yc60.com@gmail.com';
alert(pattern.test(str));

var pattern = /^([\w\.\-]+)@([\w\.\-]+)\.([\w]{2,4})$/; var str = 'yc60.com@gmail.com'; alert(pattern.test(str)); 

 

 

 

 

 

 

 

 

正则表达式中的特殊字符

字符 含意

\ 做为转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/,转意为匹配一个单词的边界。 
-或- 
对正则表达式功能字符的还原,如"*"匹配它前面元字符0次或多次,/a*/将匹配a,aa,aaa,加了"\"后,/a\*/将只匹配"a*"。 

^ 匹配一个输入或一行的开头,/^a/匹配"an A",而不匹配"An a" 
$ 匹配一个输入或一行的结尾,/a$/匹配"An a",而不匹配"an A" 
* 匹配前面元字符0次或多次,/ba*/将匹配b,ba,baa,baaa 
+ 匹配前面元字符1次或多次,/ba*/将匹配ba,baa,baaa 
? 匹配前面元字符0次或1次,/ba*/将匹配b,ba 
(x) 匹配x保存x在名为$1...$9的变量中 
x|y 匹配x或y 
{n} 精确匹配n次 
{n,} 匹配n次以上 
{n,m} 匹配n-m次 
[xyz] 字符集(character set),匹配这个集合中的任一一个字符(或元字符) 
[^xyz] 不匹配这个集合中的任何一个字符 
[\b] 匹配一个退格符 
\b 匹配一个单词的边界 
\B 匹配一个单词的非边界 
\cX 这儿,X是一个控制符,/\cM/匹配Ctrl-M 
\d 匹配一个字数字符,/\d/ = /[0-9]/ 
\D 匹配一个非字数字符,/\D/ = /[^0-9]/ 
\n 匹配一个换行符 
\r 匹配一个回车符 
\s 匹配一个空白字符,包括\n,\r,\f,\t,\v等 
\S 匹配一个非空白字符,等于/[^\n\f\r\t\v]/ 
\t 匹配一个制表符 
\v 匹配一个重直制表符 
\w 匹配一个可以组成单词的字符(alphanumeric,这是我的意译,含数字),包括下划线,如[\w]匹配"$5.98"中的5,等于[a-zA-Z0-9] 
\W 匹配一个不可以组成单词的字符,如[\W]匹配"$5.98"中的$,等于[^a-zA-Z0-9]。

用re = new RegExp("pattern",["flags"]) 的方式比较好 
pattern : 正则表达式 
flags: g (全文查找出现的所有 pattern) 
i (忽略大小写) 
m (多行查找)
vaScript动态正则表达式问题
请问正则表达式可以动态生成吗? 
例如JavaScript中: 
var str = "strTemp"; 
要生成: 
var re = /strTemp/; 
如果是字符连接: 
var re = "/" + str + "/"即可 
但是要生成表达式,可以实现吗?怎样实现?

 

posted @ 2016-11-19 17:37  飘然离去  阅读(252)  评论(0编辑  收藏  举报