javascript正则表达式学习

最近利用一周时间阅读了《精通正则表达式(第3版)》前6章,希望能够精通正则表达式,并且能够撰写《javascript深度理解正则表达式》这样的文章。一周时间太短,我自认为仅仅是达到了“不再畏惧”、“更有信心”的程度,因而本文的目标只能是帮助读者“掌握”正则表达式。

我想正则表达式之所以难,主要体现在以下几个方面:
1)正则表达式的符号晦涩难懂
2)不支持排版(至少javascript目前还不支持)
3)不能设置断点,不能跟踪调试
4)没有真正的标准,不同工具所支持的正则表达式有许多细节上的差异

下文中如涉及正则表达式符号含义不明,请参阅<<javascript正则表达式入门笔记(完整版)>>

正则表达式本质上是一整套的处理字符串的模型,帮助人们利用简短的表达式来实现复杂的算法。早期的正则表达式引擎只有三百多行代码,发展到后来也不到1万行代码。打一个不恰当的比喻,利用正则表达式处理字符串,就像是利用SQL处理数据。正如我们在处理数据时要避免使用复杂SQL,我们在处理字符串时也应当避免使用复杂的正则表达式。下面是一段判断IP地址合法性的代码,比单纯用正则表达式要简单:

var isIPAdress = function(IPStr){
    var pttrn = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/;
    var IPObj = pttrn.exec(IPStr);
    var bool_result = false;
    if(IPObj){
        //添加进一步的识别规则
        if(IPStr==="0.0.0.0"){
            bool_result = false;
        }else if(IPStr==="1.1.1.1"){
            bool_result = false;
        }else if(IPObj[1]>=0 && IPObj[1]<=255 && IPObj[2]>=0 && IPObj[2]<=255 && IPObj[3]>=0 && IPObj[3]<=255 && IPObj[4]>=0 && IPObj[4]<=255){
            bool_result = true;
        }else{
            bool_result = false;
        }
    }     

    return bool_result;
}

调试信息:

isIPAdress("10.1.6.255")    true

isIPAdress("1.1.1.1")    false

isIPAdress("10.1.a.255")    false

浅议正则表达式的执行效率

执行下面这个javascript的正则表达式,比较ie/safari/firefox/chrome的执行效率,发现safari和firefox首次打开时较慢但是再刷新可做到瞬间完成,chrome和ie则是每次打开和刷新都慢,这说明javascript在ie和chrome上还是完全基于NFA算法做优化,safari和firefox则可能用到了DFA算法(也可能是缓存)。

var p1 = /X(?:.+)+X/;
iJs.put(p1.exec("=XX=========================="));

正则表达式对象:exec方法:

如果正则表达式使用了g作为后缀,则会记住上次执行的结果,执行时会找后面匹配。

如果正则表达式没有使用g作为后缀,则每次执行的结果相同,都是取第一个匹配上的。如果使用了捕获型括号,则匹配结果可通过1/2/3/...后缀获得,参见前面给出的判断IP地址合法性的代码。

var pttrn = /bb/;
iJs.showObject(pttrn.exec("abaabbaaa"));
iJs.showObject(pttrn.exec("abaabbaaa"));
pttrn = /a+/g;
iJs.showObject(pttrn.exec("abaabbaaa"));
iJs.showObject(pttrn.exec("abaabbaaa"));

调试信息:

[Object] bb        |--[string] 0 ------------- bb        |--[number] index ------------- 4        |--[string] input ------------- abaabbaaa        |--[number] lastIndex ------------- 6

[Object] bb        |--[string] 0 ------------- bb        |--[number] index ------------- 4        |--[string] input ------------- abaabbaaa        |--[number] lastIndex ------------- 6

[Object] a        |--[string] 0 ------------- a        |--[number] index ------------- 0        |--[string] input ------------- abaabbaaa        |--[number] lastIndex ------------- 1

[Object] aa        |--[string] 0 ------------- aa        |--[number] index ------------- 2        |--[string] input ------------- abaabbaaa        |--[number] lastIndex ------------- 4

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索javascript
, 正则表达式
, 字符串
, 代码
, 处理
, javascript正则表达式
, 精通正则表达式
, 正则学习问答
, 复杂
javascript正则
,以便于您获取更多的相关知识。

时间: 2024-08-31 19:30:25

javascript正则表达式学习的相关文章

JavaScript正则表达式学习笔记与常用正则总结

一.RegExp ECMAScript通过RegExp类型类支持正则表达式,语法和Perl类似: var exp = /pattern/flags; patternb部分是任何简单的或复杂的正则表达式:flags是每个正则表达式所带的一个或者多个标志. 正则表达式的模式匹配支持三个标志: g:全局模式,即模式应用于整个字符串,而非在发现第一个匹配项时立即停止 i:不区分大小写模式 m:多行模式,即到达一行文本末尾是还会继续茶查找下一行中是否存在与模式匹配的项. 1.创建正则表达式 JavaScr

学习JavaScript正则表达式_javascript技巧

JavaScript正则表达式学习: 有个在线调试正则的工具.下面的所有示例代码,都可以在codepen上查看到. 1.创建正则表达式 var re = /ab+c/; //方式一 正则表达式字面量 var re = new RegExp("ab+c"); //方式二 RegExp对象的构造函 1)正则表达式字面量在脚本加载后编译.若你的正则表达式是常量,使用这种方式可以获得更好的性能. 2)使用构造函数,提供了对正则表达式运行时的编译.当你知道正则表达式的模式会发生改变, 或者你事先

javascript的正则表达式学习资料复习_正则表达式

关于反向引用 复制代码 代码如下: // 测试函数 function matchReg(reg, str) { var result = str.match(reg); if(result) { console.dir(result); } else { console.log('match failed'); } } var reg = /([A-Za-z]{0,6})\1/; var str = 'AndrewAndrew'; // 测试通过 matchReg(reg, str); //通过

javascript的正则表达式学习资料复习

关于反向引用 复制代码 代码如下: // 测试函数 function matchReg(reg, str) { var result = str.match(reg); if(result) { console.dir(result); } else { console.log('match failed'); } } var reg = /([A-Za-z]{0,6})\1/; var str = 'AndrewAndrew'; // 测试通过 matchReg(reg, str); //通过

javascript正则表达式的模式匹配

正则表达式,是一个描述字符模式的对象.javascript的RegExp类表示正则表达式,String和RegExp都定义了方法,后者使用正则表达式进行强大的模式匹配和文本检索与替换功能.javascript的正则表达式是perl5的这种表达式语法的大小子集,所以多有perl编程经验的程序员来说,学习javascript的正则表达式是小菜一碟. 本章首先介绍用以描述"文本模式"的正则表达式语法.随后讲解了使用表达式String和RegExp方法. 1.正则表达式的定义 javascri

JavaScript正则表达式中的global属性的使用

这篇文章主要介绍了详解JavaScript正则表达式中的global属性的使用,是JS学习进阶中的重要知识点,需要的朋友可以参考下 global是正则表达式对象的只读布尔属性.它指定是否一个特定的正则表达式进行全局匹配.否则它使用"g"属性创建. 语法 ? 1RegExpObject.global 下面是参数的详细信息: NA 返回值: 如果"g"修改被设置返回"TRUE",否则返回"FALSE". 例子: ? 1 2 3 4

JavaScript正则表达式中的ignoreCase属性使用详解

    这篇文章主要介绍了JavaScript正则表达式中的ignoreCase属性使用详解,是JS学习进阶中的重要知识点,需要的朋友可以参考下 ignoreCase是正则表达式对象的只读布尔属性.它指定是否一个特定的正则表达式执行不区分大小写的匹配.,它与"i"属性创建. 语法 ? 1 RegExpObject.ignoreCase        下面是参数的详细信息: NA 返回值: 如果"i"修改被设置返回"TRUE",否则返回"

JavaScript正则表达式之multiline属性的应用

        这篇文章主要介绍了JavaScript正则表达式之multiline属性的应用,是JS学习进阶中的重要知识,需要的朋友可以参考下             多行正则表达式是对象的只读布尔属性.它指定是否一个特定的正则表达式进行多行匹配,即,不管是否使用"m"属性创建. 语法 ? 1 RegExpObject.multiline 下面是参数的详细信息: NA 返回值: 如果"m"修改被设置返回"TRUE",否则返回"FALS

JavaScript正则表达式(总结篇)

本文是小编参考其他有关js正则表达式资料整理的,主要目的有两个:一:自我复习归纳总结.二:共享方便大家搜索 .js正则表达式感兴趣的朋友可以一起学习,没有写的知识点,欢迎大家补充,共同学习进步. 验证数字:^[0-9]*$ 验证n位的数字:^\d{n}$ 验证至少n位数字:^\d{n,}$ 验证m-n位的数字:^\d{m,n}$ 验证零和非零开头的数字:^(0|[1-9][0-9]*)$ 验证有两位小数的正实数:^[0-9]+(.[0-9]{2})?$ 验证有1-3位小数的正实数:^[0-9]+