JavaScript中使用正则表达式的一点笔记

前几天在空隙时间在读Mastering Regular Expressions这本书。不愧是关于正则表达式的一本好书,我也应该买一本的。现在是暂时借了阿威买的第三版的中文版来读。中文版翻译得还不错。有不少地方感觉翻译得挺精彩的,虽然马上就能猜到原文是怎么写的,但读起来中文一点都不觉得拗口。

现在才读到第76页,第二章,比较入门的部分。以前也不是没用过正则表达式,不过一边读这书一边就觉得以前真的中了很多陷阱。而且我居然一直不知道正则表达式里面有lookaround(positive/negative lookahead/lookbehind)这种好用的东西……真糟糕。不过现在学到也还不算迟。

比较麻烦的是第二章里几乎全部代码例子都是perl写的,而我以前虽然没少用别人写的perl脚本,自己却几乎没写过perl代码。这下是领略到了不少perl的威力啊。

简单来说,像这样:

Perl代码

1.$input = <STDIN>; # get a line of input from stdin2.chomp( $input );  # cut the trailing newline character3.4.# verify the input as a decimal number5.if ( $input =~ /^([-+]?[0-9]+(?:\.[0-9]*)?)$/ ) {6.    # verified7.    $result = $input * 2;8.    print "input multiplied by 2 is: $result";9.} else {10.    # verification failed11.    print "Expecting a number, so I don't understand \"$input\".\n";12.}

在我看来就是语言的动态特性与正则表达式的优美结合啊。($input的类型可以自动在String与number之间转换,而正则表达式可以作用在String版本的类型上来检查输入的一行内容里是不是一个合法的数字。)

回头想想,我最初接触正则表达式的时候是在Java上用的。虽然编译原理课上也有讲到DFA/NFA与正则表达式,但那个时候没用在C/C++里用过正则表达式而只是实现过些简单的DFA。

Java里要用正则表达式颇不顺手。最痛苦的莫过于转义字符的问题。那时我对正则表达式里常用的一些预定义字符组之类的很不熟悉,只好阅读Java标准库的JavaDoc来学习。看看java.util.regex.Pattern类的JavaDoc,可以看到很多与转义字符相关的预定义字符组之类的东西,但我当时花了很长时间才理解到Java本身字符串中的转义字符与正则表达式中的转义字符不是一回事——它们是叠加的。为了表达正则表达式里的\b,用Java应该写成"\\b"的字符串;为了匹配一个斜杠和句点“\.”而要写出正则表达式\\\.,在Java中却得写成"\\\\\\."。结果我经常在大量的“\”中迷茫,到底写了多少个“\”都数不清了……

接触到有verbatim string的C#和有Wysiwyg string的D之后这转义的问题减轻了不少,不过要是能直接写正则表达式的字面量而不是用字符串来表示正则表达式就更舒服了。在阅读一些JavaScript的相关文章时留意到有不少人提到“perl风格的正则表达式记法”,查了下,发现这种以operation/regex/modifier为形式的记法确实好用。不过当时也是随便写了几个JavaScript的小测试玩了玩就没管了,也没去看看这记法的来源——perl里它到底长什么样。这次就多记点JavaScript里的perl-style regex吧。

笔记

在WebRef上有一套关于JavaScript的教程,不过比较老了,是1997年12月4日最后编辑的。虽然文章比较老了,其中关于正则表达式的部分还是可以参考的;毕竟ECMAScript在v3之后就一直没正式发布更新的版本嘛。JavaScript 1.8要跟随FireFox 3.0才会出现,而JavaScript 2.0得等ECMAScript最终确定。漫长啊。JavaScript 1.8的技巧似乎在这里有些记载,有空的时候要去看看。

等我买了新的犀牛书之后再结合ECMA-262来检查一下有没有些什么更新的地方好了……

Mozilla MDC有对应JavaScript 1.5(带有1.8更新)的正则表达式文档。

一些关于lookaround的介绍

先来看点简单的例子吧。

Js代码

1.<script>2.var str = "<STRONG>text here</STRONG>123"3.var regex = /^<([^>]*)>.*<\/\1>(?=\d+)/4.5.// EXAMPLE 16.// validate a string with given regex, returning a boolean value7.var result = regex.test(str)8.document.write(result + "<BR />") // true9.10.// EXAMPLE 211.// match a string with given regex, returning the matches in an array12.result = /(?=\w)(?:[^>]*) (?=\w)/.exec(str)13.document.write(result + "<BR />")14.// text15.16.for (var i in result) {17.    document.write(i + ": " + result[i] + "<BR />")18.}19.// input: text here12320.// index: 821.// lastIndex: 1322.// 0: text23.24.// EXAMPLE 325.// match a string with given regex, returning the matches in an array26.result = str.match(regex)27.for (var i in result) {28.    document.write(i + ": " + result[i] + "<BR />")29.}30.// input: <STRONG>text here</STRONG>12331.// index: 032.// lastIndex: 2633.// 0: <STRONG>text here</STRONG>34.// 1: STRONG35.36.// EXAMPLE 437.// substitute a matched string with some other string38.result = "vaarbcaAdbcae".replace(/(a)+(?:.*)(bc)/gi, "_$2-$1_")39.document.write(result + "<BR />")40.// v_bc-a_ae41.42.// EXAMPLE 543.// substitute a matched string with some other string44.result = "vaarbcaAdbcae".replace(/(a)+(?:.*)(bc)/gi, function(str, p1, p2) {45.  return "_" + p2 + "+" + p1 + "_"46.})47.document.write(result + "<BR />")48.// v_bc+a_ae49.</script>

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索javascript
, 正则表达式
, string
, input
, result
, 转义
, 表达式的转义问题
, java1.8
, V1.8+中文语言包
Lookaround
javascript正则表达式、正则表达式学习笔记、正则表达式笔记、李炎恢javascript笔记、javascript笔记,以便于您获取更多的相关知识。

时间: 2024-08-03 07:30:27

JavaScript中使用正则表达式的一点笔记的相关文章

重温JavaScript中的正则表达式 js学习笔记

一.创建正则表达式 创建正则表达式和创建字符串类似 , 创建正则表达式提供了两种方法 , 一种是采用 new运算符,另一个是采用字面量方式. 复制代码 代码如下: var dog = new RegExp('dog'); // 第一个参数字符串 var dog = new RegExp('dog', 'ig'); // 第二个参数可选模式修饰符 var dog = /dog/; var dog = /dog/ig; //字面量方式. RegExp 对象包含两个方法 : test() 和 exec

javascript中的正则表达式使用指南

 这篇文章主要给大家介绍了Javascript中的正则表达式的使用方式,非常的详细,并附上简单示例,这里推荐给大家.     使用方式 1.创建表达式 JavaScript中创建正则表达式类的方法: var regex = new RegExp("d{5}") 或者 2.var regex = / d{5} /(推荐) /表达式/是JavaScript中专门为简化正则表达式编写而提供的语法,写在//中的正则表达式就不用管转义符了. RegExp对象的方法: 2.判断是否匹配 test(

JavaScript中的正则表达式介绍

 这篇文章主要介绍了JavaScript中的正则表达式,简明总结了正则中的语法含义和RegExp对象,需要的朋友可以参考下 一.定义正则表达式的方法   定义正则表达式的方法有两种:构造函数定义和正则表达式直接量定义.例如:    代码如下:var reg1 = new RegExp('d{5, 11}'); // 通过构造函数定义 var reg2 = /d{5, 12}/; // 通过直接量定义   正则表达式直接量字符        o:NUL字符(u0000)        t:制表符(

javascript中的正则表达式看不太懂,求解释

问题描述 javascript中的正则表达式看不太懂,求解释 <script type="text/javascript"> /* 赋值合同行下标 */ var electronicContractRowIdx = 0, /* 获取合同模板 */ electronicContractTpl = $("#electronicContractTpl") .html().replace(/(//<!--)|(//-->)/g,""

比较全面的C 、Java、JavaScript中的正则表达式详解_正则表达式

什么是正则表达式? 正则表达式(Regular Expression) 就是用某种模式去匹配一类字符串的公式.如你要在一篇文章中查找第一个字是"罗"最后一个字是"浩"的三个字的姓名,即"罗 * 浩":那么"罗 * 浩"就是公式,也称作 模式(Pattern) ,这篇文章就是 要匹配的串( 或叫文本 text) .再如,你要检查输入的一个字符串是否是 126 邮箱的格式,你得制定一个规则去查检,这种规则就是正则表达式. 从入门开

javascript中的正则表达式使用指南_javascript技巧

使用方式 1.创建表达式 JavaScript中创建正则表达式类的方法: var regex = new RegExp("\\d{5}") 或者 2.var regex = / \d{5} /(推荐) /表达式/是JavaScript中专门为简化正则表达式编写而提供的语法,写在//中的正则表达式就不用管转义符了. RegExp对象的方法: 2.判断是否匹配 test(str)判断字符串str是否匹配正则表达式,相当于IsMatch 复制代码 代码如下:         var rege

JavaScript中的正则表达式解析_正则表达式

JavaScript中的正则表达式解析 正则表达式(regular expression)对象包含一个正则表达式模式(pattern).它具有用正则表达式模式去匹配或代替一个字符串(string)中特定字符(或字符集合)的属性(properties)和方法(methods).要为一个单独的正则表达式添加属性,可以使用正则表达式构造函数(constructor function),无论何时被调用的预设置的正则表达式拥有静态的属性(the predefined RegExp object has s

C++、Java、JavaScript中的正则表达式

编程思想之正则表达式   什么是正则表达式? 正则表达式(Regular Expression)就是用某种模式去匹配一类字符串的公式.如你要在一篇文章中查找第一个字是"罗"最后一个字是"浩"的三个字的姓名,即"罗*浩":那么"罗*浩"就是公式,也称作模式(Pattern),这篇文章就是要匹配的串(或叫文本text).再如,你要检查输入的一个字符串是否是126邮箱的格式,你得制定一个规则去查检,这种规则就是正则表达式. 从入门开

JavaScript中的正则表达式解析

javascript|正则 正则表达式是一个描述字符模式的对象. JavaScript的RegExp对象和String对象定义了使用正则表达式来执行强大的模式匹配和文本检索与替换函数的方法. 在JavaScript中,正则表达式是由一个RegExp对象表示的.当然,可以使用一个RegExp()构造函数来创建RegExp对象,也可以用JavaScript 1.2中的新添加的一个特殊语法来创建RegExp对象.就像字符串直接量被定义为包含在引号内的字符一样,正则表达式直接量也被定义为包含在一对斜杠(