zoukankan      html  css  js  c++  java
  • 正则表达式那些事儿(三)

    我们来简单的回顾下前两篇文稿中,我们讨论了那些内容。首先我们知道了 “正则表达式” 是神马,如何去定义,并写出第一个过滤字母的程序。

    在了解修饰符概念和作用后,我们能够使用 'g' 匹配字符串中所有的符合项目,亦能够使用 'i' 区分大小写。

    这篇文稿中,我们来整体的了解下正则表达式的概念与相关应用。

    一、定义方法与修饰符,此处不赘述,请参考第一,第二篇文稿。

    http://www.cnblogs.com/dereksunok/p/3670355.html

    http://www.cnblogs.com/dereksunok/p/3672473.html

    二、查找范围

    表达式描述
    [abc] 查找方括号之间的任何字符。
    [^abc] 查找任何不在方括号之间的字符。
    [0-9] 查找任何从 0 至 9 的数字。
    [a-z] 查找任何从小写 a 到小写 z 的字符。
    [A-Z] 查找任何从大写 A 到大写 Z 的字符。
    [a-Z] 查找任何从小写 a 到大写 Z 的字符。
    [adgk] 查找给定集合内的任何字符。
    [^adgk] 查找给定集合外的任何字符。
    [red|blue|green] 查找任何指定的选项。

    参考上面表格中的内容,示例代码走一个。

    代码五:将阿拉伯数字替换成中文

     1 <!doctype html>
     2 <html>
     3 <head>
     4 <meta charset="utf-8">
     5 </head>
     6 <body>
     7 <span id="str"></span>
     8 <script>
     9 window.onload = function() {
    10     filterLetters();
    11 }
    12 
    13 function filterLetters() {
    14     var str = '他有1本css相关的书,还有2本js方面的和4本java方面的参考手册。';
    15     //纯粹瞎编,少年们不要在意这些细节
    16     var reg = /[0-9]/g;
    17     str = str.replace(reg,function(at){return changeNumToZH(at);});
    18     document.getElementById('str').innerHTML=str;
    19 }
    20 function changeNumToZH(string){
    21     switch(string){
    22         case '0':return '零';
    23         break;
    24         case '1':return '一';
    25         break;
    26         case '2':return '二';
    27         break;
    28         case '3':return '三';
    29         break;
    30         case '4':return '四';
    31         break;
    32         case '5':return '五';
    33         break;
    34         case '6':return '六';
    35         break;
    36         case '7':return '七';
    37         break;
    38         case '8':return '八';
    39         break;
    40         case '9':return '九';
    41         break;
    42         default:return '-1';
    43         break;
    44     }
    45 }
    46 </script>
    47 </body>
    48 </html>

    简单分析》

    上面的小程序里,我们接触到 replace() 这个方法的另一种作用,str.replace(reg,function(string){ return string; }); 第二个参数可以是一个字符串,也可以是一个带参数的函数。

    我们在字符串中找到所有的数字后,使用 changeNumToZH(string) 使用返回值的方法将匹配的数字替换成英文。仅此而已。

    我们一步步挖掘正则表达式的语法规则,将它神秘的面纱一层层剥下。

    到这里,我们回顾下第二篇结尾留给大家思考的问题:若字符串中有多个大小写不一的匹配项时,我们该如何写这个小程序呢?

    在了解了查找范围的功能后,仔细的少年们一定会关注到 (red | blue | green) 的作用。

    我们来体验一下这个神奇的功能!

    代码六:忽略大小写查找并替换所有匹配项

     1 <!doctype html>
     2 <html>
     3 <head>
     4 <meta charset="utf-8">
     5 </head>
     6 <body>
     7 <p id="txt">He was very wealthy, he is very attractive, he is a school tyrants!</p>
     8 <p style="color:#999;">他很富有,他很有魅力,他是一个学霸!(他是我们的“敌人”,“她”是我们的“朋友”,把‘He’变成‘she’)</p>
     9 <p id="text01"></p>
    10 <script>
    11 window.onload = function() {
    12     filterLetters();
    13 }
    14 
    15 function filterLetters() {
    16     var str = document.getElementById("txt").innerHTML;
    17     var reg = /(he|He)/g;
    18     str = str.replace(reg,"she");
    19     var reg02 = /s/;
    20     str = str.replace(reg02,'S');
    21     document.getElementById('text01').innerHTML=str;
    22 }
    23 </script>
    24 </body>
    25 </html>

    三、元字符

    元字符描述
    . 查找单个字符,除了换行和行结束符。
    w 查找单词字符。
    W 查找非单词字符。
    d 查找数字。
    D 查找非数字字符。
    s 查找空白字符。
    S 查找非空白字符。
     匹配单词边界。
    B 匹配非单词边界。
    查找 NUL 字符。
    查找换行符。
    f 查找换页符。
    查找回车符。
    查找制表符。
    v 查找垂直制表符。
    xxx 查找以八进制数 xxx 规定的字符。
    xdd 查找以十六进制数 dd 规定的字符。
    uxxxx 查找以十六进制数 xxxx 规定的 Unicode 字符。

    看过上边的参考,我们抛开元字符本身的概念,联系一下英语中“元音字母”的概念,大家就能想到其中的奥妙所在。这是javascript在提供现成的工具给我们使用。

    其中有一点需要注意的是,要尽量避免使用 '.' (查找单个字符,除了换行和行结束符),这个过滤的方法太泛泛,把握不好很容易出错。

    让我们感到很惊奇的有 w  W  d  D  s  S,代码走起:

    代码七:查找出所有的数字,并加上单位符号。

     1 <!doctype html>
     2 <html>
     3 <head>
     4 <meta charset="utf-8">
     5 </head>
     6 <body>
     7 <p id="txt">公司今年的开支预算大约是100000,业绩达到500000,广告投放40000。</p>
     8 <p id="text01"></p>
     9 <script>
    10 window.onload = function() {
    11     filterLetters();
    12 }
    13 
    14 function filterLetters() {
    15     var str = document.getElementById("txt").innerHTML;
    16     var reg = /d+/g;
    17     var arry = str.match(reg);
    18     str = str.replace(reg,function(exc){
    19         return "¥"+exc;
    20     })
    21     document.getElementById('text01').innerHTML=str;
    22 }
    23 </script>
    24 </body>
    25 </html>

    很简单的小程序,我们学会使用 replace()方法中的函数参数去遍历正则表达式过滤出来的项目。唔,自信心是不是又增加了一成!

    只不过里面有一个小符号 “+” 略有生疏,这是什么意思呢?我们把“+”去掉试试

    1 function test(){
    2     var strs = '100000';
    3     var reg = /d/g;
    4     strs.match(reg);
    5 }

    运行后得到了我们不太想得到的结果:

    由此可知“+”的含义是不是找到临近的相同匹配项目呢?我们来看下正则表达式中另一个重要的工具,量词

    量词描述
    n+ 匹配任何包含至少一个 n 的字符串。
    n* 匹配任何包含零个或多个 n 的字符串。
    n? 匹配任何包含零个或一个 n 的字符串。
    n{X} 匹配包含 X 个 n 的序列的字符串。
    n{X,Y} 匹配包含 X 或 Y 个 n 的序列的字符串。
    n{X,} 匹配包含至少 X 个 n 的序列的字符串。
    n$ 匹配任何结尾为 n 的字符串。
    ^n 匹配任何开头为 n 的字符串。
    ?=n 匹配任何其后紧接指定字符串 n 的字符串。
    ?!n 匹配任何其后没有紧接指定字符串 n 的字符串。

    看到这些更加怪异的代码,心里是不是会不自由得发出这样的心声,这特么的怎么用啊?

    朋友们莫急,我们不是已经了解了“+”的用法吗?表格中前六项都是类似含义的用法,我们来看看 “^” 和 “$”的用法。

     1 <!doctype html>
     2 <html>
     3 <head>
     4 <meta charset="utf-8">
     5 </head>
     6 <body>
     7 <p>输出结果:<span id="text01">.</span></p>
     8 <button id="btn01" onclick="filterStart();">filterStart</button><br>
     9 <button id="btn01" onclick="filterStop();">filterStop</button>
    10 <script>
    11 window.onload = function() {
    12 
    13 }
    14 
    15 function filterStart() {
    16     var str = "123 abc";
    17     var reg = /^d+/g;
    18     var resalut = reg.test(str);
    19     var s = str.match(reg)
    20     document.getElementById('text01').innerHTML=resalut +" 匹配项:"+ s;
    21 }
    22 
    23 function filterStop(){
    24     var strs = 'abc cba 321';
    25     var regs = /d+$/g;
    26     var resalut = regs.test(strs);
    27     var s = strs.match(regs)
    28     document.getElementById('text01').innerHTML=resalut +" 匹配项:"+ s;
    29 }
    30 </script>
    31 </body>
    32 </html>

    代码走起,云消雾散了吧!

    参考手册:http://www.w3school.com.cn/jsref/jsref_obj_regexp.asp

  • 相关阅读:
    Mybatis-plus学习笔记(一)
    Mysql基础(四)分组查询及连接查询
    Mysql 基础(三)排序查询及常用函数
    CyclicBarrier 使用详解
    countDownLatch
    pom所有依赖version红色但是不影响运行
    iText5实现Java生成PDF文件完整版
    【Maven】---Nexus私服配置Setting和Pom
    引用、指针、const、define、static、sizeof、左值右值
    事物隔离级别、MVCC以及数据库中常见锁介绍
  • 原文地址:https://www.cnblogs.com/dereksunok/p/3678899.html
Copyright © 2011-2022 走看看