当前位置: 老葡京网站娱乐 > web开发 > 脚本语言 > 正文

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

时间:2010-05-23 javaeye.com RednaxelaFX

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

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

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

简单来说,像这样:

Perl代码

1.$input = <STDIN>; # get a line of input from stdin
2.chomp( $input ); # cut the trailing newline character
3.
4.# verify the input as a decimal number
5.if ( $input =~ /^([-+]?[0-9]+(?:\.[0-9]*)?)$/ ) {
6. # verified
7. $result = $input * 2;
8. print "input multiplied by 2 is: $result";
9.} else {
10. # verification failed
11. 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来学习??纯磈ava.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 1
6.// validate a string with given regex, returning a boolean value
7.var result = regex.test(str)
8.document.write(result + "<BR />") // true
9.
10.// EXAMPLE 2
11.// match a string with given regex, returning the matches in an array
12.result = /(?=\w)(?:[^>]*) (?=\w)/.exec(str)
13.document.write(result + "<BR />")
14.// text
15.
16.for (var i in result) {
17. document.write(i + ": " + result[i] + "<BR />")
18.}
19.// input: text here123
20.// index: 8
21.// lastIndex: 13
22.// 0: text
23.
24.// EXAMPLE 3
25.// match a string with given regex, returning the matches in an array
26.result = str.match(regex)
27.for (var i in result) {
28. document.write(i + ": " + result[i] + "<BR />")
29.}
30.// input: <STRONG>text here</STRONG>123
31.// index: 0
32.// lastIndex: 26
33.// 0: <STRONG>text here</STRONG>
34.// 1: STRONG
35.
36.// EXAMPLE 4
37.// substitute a matched string with some other string
38.result = "vaarbcaAdbcae".replace(/(a)+(?:.*)(bc)/gi, "_$2-$1_")
39.document.write(result + "<BR />")
40.// v_bc-a_ae
41.
42.// EXAMPLE 5
43.// substitute a matched string with some other string
44.result = "vaarbcaAdbcae".replace(/(a)+(?:.*)(bc)/gi, function(str, p1, p2) {
45. return "_" + p2 + "+" + p1 + "_"
46.})
47.document.write(result + "<BR />")
48.// v_bc+a_ae
49.</script>