前言
最近发现JavaScript中的正则在某些地方的表现和其他语言或工具中的正则有些不同,比较另类.虽然你几乎不可能写出也几乎用不到下面我讲的这些正则,但是了解一下毕竟是好的.
本文中的代码示例都是在兼容ES5的JavaScript环境中执行的,也就是说,IE9之前版本,Fx4左右的版本,等,中的表现很有可能和我下面讲的不一样.
1.空字符类
不包含任何字符的字符类[]
称之为空字符类(empty char class
),我相信你没听别人这么叫过,因为在其他语言中,这种写法是非法的,所有的文档和教程都不会讲一种非法的语法.下面我演示一下其他语言或工具都是怎么报这个错的:
$echo | grep '[]'grep: Unmatched [ or [^$echo | sed '/[]/'sed:-e 表达式 #1,字符 4:未终止的地址正则表达式$echo | awk '/[]/'awk: cmd. line:1: /[]/awk: cmd. line:1: ^ unterminated regexpawk: 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 expressionsre_constants.error: unexpected end of regular expression
而在JavaScript中,空字符类是合法的正则组成部分,不过它的效果是"永不匹配",也就是匹配什么都会失败.相当于一个空否定正向环视(empty negative lookahead)(?!)
的效果:
js> "whatever/n".match(/[]/g) //空字符类,永不匹配nulljs> "whatever/n".match(/(?!)/g) //空否定正向环视,永不匹配null
很显然,这种东西在JavaScript中没什么用.
2.否定空字符类
不包含任何字符的否定字符类[^]称之为否定空字符类(negative empty char class)或者叫空否定字符类(empty negative char class),都可以,因为这个名词是我"自创"的,和上面讲的空字符类类似,这种写法在其他语言中也是非法的:
$echo | grep '[^]'grep: Unmatched [ or [^$echo | sed '/[^]/'sed:-e 表达式 #1,字符 5:未终止的地址正则表达式$echo | awk '/[^]/'awk: cmd. line:1: /[^]/awk: cmd. line:1: ^ unterminated regexpawk: 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 expressionsre_constants.error: unexpected end of regular expression$
新闻热点
疑难解答
图片精选