来源:紫云飞的博客
我接触过不少语言,我很看重一门语言的正则表达式是否强大,还有正则与语法的结合是否紧密。在这一点上,JavaScript做的还不错,至少有正则字面量。当然,最强大的还是Perl。我最近发现,JavaScript中的正则在某些地方的表现和其他语言或工具中的正则有些不同,比较另类。虽然你几乎不可能写出也几乎用不到下面我讲的这些正则,但是了解一下毕竟是好的。本文中的代码示例都是在兼容ES5的JavaScript环境中执行的,也就是说,IE9之前版本,Fx4左右的版本等中的表现很有可能和我下面讲的不一样。
1.空字符类
不包含任何字符的字符类[]称之为空字符类(empty char class),我相信你没听别人这么叫过,因为在其他语言中,这种写法是非法的,所有的文档和教程都不会讲一种非法的语法.下面我演示一下其他语言或工具都是怎么报这个错的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
$echo | grep '[]' grep: Unmatched [ or [^ $echo | sed '/[]/' sed:-e 表达式 #1,字符 4:未终止的地址正则表达式 $echo | awk '/[]/' awk: cmd. line:1: /[]/ awk: cmd. line:1: ^ unterminated regexp awk: cmd. line:1: error: Unmatched [ or [^: /[]// $echo | perl -ne '/[]/' Unmatched [ in regex; marked by <-- HERE in m/[ <-- HERE ]/ at -e line 1. $echo | ruby -ne '/[]/' -e:1: empty char-class: /[]/ $python -c 'import re;re.match("[]","")' Traceback (most recent call last): File "<string>", line 1, in <module> File "E:\Python\lib\re.py", line 137, in match return _compile(pattern, flags).match(string) File "E:\Python\lib\re.py", line 244, in _compile raise error, v # invalid expression sre_constants.error: unexpected end of regular expression |
而在JavaScript中,空字符类是合法的正则组成部分,不过它的效果是”永不匹配”,也就是匹配什么都会失败.相当于一个空否定正向环视(empty negative lookahead)(?!)的效果:
1 2 3 4 |
js> "whatever\n".match(/[]/g) //空字符类,永不匹配 null js> "whatever\n".match(/(?!)/g) //空否定正向环视,永不匹配 null |
很显然,这种东西在JavaScript中没什么用.
2.否定空字符类
不包含任何字符的否定字符类[^]称之为否定空字符类(negative empty char class)或者叫空否定字符类(empty negative char class),都可以,因为这个名词是我”自创”的,和上面讲的空字符类类似,这种写法在其他语言中也是非法的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
$echo | grep '[^]' grep: Unmatched [ or [^ $echo | sed '/[^]/' sed:-e 表达式 #1,字符 5:未终止的地址正则表达式 $echo | awk '/[^]/' awk: cmd. line:1: /[^]/ awk: cmd. line:1: ^ unterminated regexp awk: cmd. line:1: error: Unmatched [ or [^: /[^]// $echo | perl -ne '/[^]/' Unmatched [ in regex; marked by <-- HERE in m/[ <-- HERE ^]/ at -e line 1. $on-v">at -e line 1. $然你几乎不可能写出也几乎用不到下面我讲的这些正则,但是了解一下毕竟是好的。本文中的代码示例都是在兼容ES5的JavaScript环境中执行的,也就是说,IE9之前版本,Fx4左右的版本等中的表现很有可能和我下面讲的不一样。
1.空字符类 不包含任何字符的字符类[]称之为空字符类(empty char class),我相信你没听别人这么叫过,因为在其他语言中,这种写法是非法的,所有的文档和教程都不会讲一种非法的语法.下面我演示一下其他语言或工具都是怎么报这个错的:
而在JavaScript中,空字符类是合法的正则组成部分,不过它的效果是”永不匹配”,也就是匹配什么都会失败.相当于一个空否定正向环视(empty negative lookahead)(?!)的效果:
很显然,这种东西在JavaScript中没什么用. 2.否定空字符类 不包含任何字符的否定字符类[^]称之为否定空字符类(negative empty char class)或者叫空否定字符类(empty negative char class),都可以,因为这个名词是我”自创”的,和上面讲的空字符类类似,这种写法在其他语言中也是非法的:
|