专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »编程综合 » javascript正则:JavaScript 正则表达式解析 »正文

javascript正则:JavaScript 正则表达式解析

来源: 发布时间:星期日, 2009年9月6日 浏览:50次 评论:0
JavaScriptRegExp对象和String对象定义了使用正则表达式来执行强大模式匹配和文本检索和替换思路方法.
  在JavaScript中,正则表达式是由个RegExp对象表示.当然,可以使用个RegExp构造来创建RegExp对象,也可以用 JavaScript 1.2中新添加个特殊语法来创建RegExp对象.就像串直接量被定义为包含在引号内样,正则表达式直接量也被定义为包含在对斜杠 (/)的间.所以,JavaScript可能会包含如下代码:
var pattern = /s$/;
  这行代码创建个新RegExp对象,并将它赋给变量parttern.这个特殊RegExp对象和所有以字母"s"结尾串都匹配.用RegExp也可以定义个等价正则表达式,代码如下:
var pattern = RegExp("s$");
  无论是用正则表达式直接量还是用构造RegExp,创建个RegExp对象都是比较容易.较为困难任务是用正则表达式语法来描述模式.JavaScript采用是Perl语言正则表达式语法个相当完整子集.
  正则表达式模式规范标准是由系列构成.大多数(包括所有字母数字)描述都是按照字面意思进行匹配.这样说来,正则表达式 /java/就和所有包含子串 "java" 串相匹配.虽然正则表达式中其它不是按照字面意思进行匹配,但它们都具有特殊意义.正则表达式 /s$/ 包含两个.
  第个特殊 "s" 是按照字面意思和自身相匹配.第 2个 "$" 是个特殊,它所匹配结尾.所以正则表达式 /s$/ 匹配就是以字母 "s" 结尾
串.
  1.直接量
  我们已经发现了,在正则表达式中所有字母和数字都是按照字面意思和自身相匹配.JavaScript正则表达式还通过以反斜杠(\)开头转义序列支持某些非
  字母.例如,序列 "\n" 在串中匹配个直接量换行符.在正则表达式中,许多标点符号都有特殊含义.下面是这些和它们含义:
  正则表达式直接量
匹配
________________________________
字母数字 自身
\ f 换页符
\ n 换行符
\ r 回车
\ t 制表符
\ v 垂直制表符
\ / 个 / 直接量
\ \ 个 \ 直接量
\ . 个 . 直接量
\ * 个 * 直接量
\ + 个 + 直接量
\ ? 个 ? 直接量
\ | 个 | 直接量
\ ( 个 ( 直接量
\ ) 个 ) 直接量
\ [ 个 [ 直接量
\ ] 个 ] 直接量
\ { 个 { 直接量
\ } 个 } 直接量
\ XXX 由十进制数 XXX 指 定ASCII码
\ Xnn 由十 6进制数 nn 指定ASCII码
\ cX 控制^X. 例如, \cI等价于 \t, \cJ等价于 \n
___________________________________________________
如果想在正则表达式中使用特殊标点符号,必须在它们的前加上个 "\" .
  2.
  将单独直接符放进中括号内就可以组合成类.类和它所包含任何都匹配,所以正则表达式 / [abc] / 和字母 "a" , "b" , "c" 中任何个都匹配.另外还可以定义否定类,这些类匹配是除那些包含在中括号的内所有.定义否定尖时,要将个 ^ 符号作为从左中括号算起.正则表达式集合是 / [a-zA-z0-9] / .
  由于某些类非常常用,所以JavaScript正则表达式语法包含些特殊和转义序列来表示这些常用类.例如, \s 匹配是空格符,制表符和其它空白符, \s匹配则是空白符的外任何.
  正则表灰式
匹配
____________________________________________________
[...] 位于括号的内任意
[^...] 不在括号的中任意
. 除了换行符的外任意,等价于[^\n]
\w 任何单字, 等价于[a-zA-Z0-9]
\W 任何非单字,等价于[^a-zA-Z0-9]
\s 任何空白符,等价于[\ t \ n \ r \ f \ v]
\S 任何非空白符,等价于[^\ t \ n \ r \ f \ v]
\d 任何数字,等价于[0-9]
\D 除了数字的外任何,等价于[^0-9]
[\b] 个退格直接量(特例)
________________________________________________________________
  3.复制
  用以上正则表式语法,可以把两位数描述成 / \ d \ d /,把 4位数描述成 / \d \ d \ d \ d /.但我们还没有种思路方法可以用来描述具有任意多数位数字或者是
  串.这个串由 3个以及跟随在字母的后位数字构成.这些复杂模式使用正则表达式语法指定了该表达式中每个元素要重复出现次数.
  指定复制总是出现在它们所作用模式后面.由于某种复制类型相当常用.所以有些特殊专门用于表示它们.例如: +号匹配就是复制前模式次或多次模式.下面表列出了复制语法.先看个例子:
/\d{2, 4}/ //匹配2到4间数字.
/\w{3} \d?/ //匹配 3个单字个任意数字.
/\s+java\s+/ //匹配串"java" ,并且该串前后可以有个或多个空格.
/[^"] * / //匹配零个或多个非引号.
  正则表达式复制
含义
__________________________________________________________________
{n, m} 匹配前项至少n次,但是不能超过m次
{n, } 匹配前项n次,或者多次
{n} 匹配前项恰好n次
? 匹配前项0次或1次,也就是说前项是可选. 等价于 {0, 1}
+ 匹配前项1次或多次,等价于{1,}
* 匹配前项0次或多次.等价于{0,}
___________________________________________________________________
  4.选择,分组和引用
  正则表达式语法还包括指定选择项,对子表达式分组和引用前子表达式特殊.| 用于分隔供选择.例如: /ab|cd|ef/ 匹配串 "ab",或者是串 "cd",又或者 "ef". /\d{3}|[a-z]{4}/ 匹配是要么是个 3位数,要么是 4个小写字母.在正则表达式中括号具有几种作用.它主要作用是把单独项目分组成子表达式,以便可以像处理个独立单元那种用 *、+或? 来处理那些项目.例如: /java(script) ?/ 匹配串 "java",其后既可以有 "script",也可以没有. /(ab|cd) + |ef) / 匹配既可以是串 "ef",也可以是串"ab" 或者 "cd" 次或多次重复.
  在正则表达式中,括号第 2个用途是在完整模式中定义子模式个正则表达式成功地和目标串相匹配时,可以从目标串中抽出和括号中子模式相匹配部分.例如,假定我们正在检索模式是个或多个字母后面跟随位或多位数字,那么我们可以使用模式 / [a-z] + \ d+/.但是由于假定我们真正关心是每个匹配尾部数字,那么如果我们将模式数字部分放在括号中 (/ [a-z] + (\d+)/) ,我们就可以从所检索到任何匹配中抽取数字了,的后我们会对此进行解析.
  代括号子表达式个用途是,允许我们在同正则表达式后面引用前面子表达式.这是通过在串 \ 后加位或多位数字来实现.数字指是代括号子表达式在正则表达式中位置.例如: \1 引用是第个代括号子表达式. \3 引用是第 3个代括号子表达式.注意,由于子表达式可以嵌套在其它子表达式中,所以它位置是被计数左括号位置.
  例如:在下面正则表达式被指定为 \2:
/([Jj]ava([Ss]cript)) \sis \s (fun\w*) /
  对正则表达式中前子表达式引用所指定并不是那个子表达式模式,而是和那个模式相匹配文本.这样,引用就不只是帮助你输入正则表达式重复部分快捷方式了,它还实施了条规约,那就是串各个分离部分包含是完全相同.例如:下面正则表达式匹配就是位于单引号或双引号的内所有.但是,它要求开始和结束引号匹配(例如两个都是双引号或者都是单引号):
/[' "] [^ ' "]*[' "]/
  如果要求开始和结束引号匹配,我们可以使用如下引用:
/( [' "] ) [^ ' "] * \1/
  \1匹配是第个代括号子表达式所匹配模式.在这个例子中,它实施了种规约,那就是开始引号必须和结束引号相匹配.注意,如果反斜杠后跟随数字比代括号子表达式数多,那么它就会被解析为个十进制转义序列,而不是个引用.你可以坚持使用完整 3个来表示转义序列,这们就可以避免混淆了.例如,使用 \044,而不是\44.下面是正则表达式选择、分组和引用:
含义
______________________________________
| 选择.匹配要么是该符号左边子表达式,要么它右边子表达式
(...) 分组.将几个项目分为个单元.这个单元可由 *、+、?和|等符号使用,而且还可以记住和这个组匹配以供此后引用使用
\n 和第n个分组所匹配相匹配.分组是括号中子表达式(可能是嵌套).分组号是从左到右计数左括号数
______________________________________
  5.指定匹配位置
  我们已经看到了,个正则表达式中许多元素才能够匹配.例如: \s 匹配只是个空白符.还有些正则表达式元素匹配的间宽度为0空间,而不是实际例如: \b 匹配个词语边界,也就是处于个/w字个\w非字的间边界.像\b 这样并不指定任何个匹配了串中,它们指定是匹配所发生合法位置.有时我们称这些元素为正则表达式锚.它们将模式定位在检索串中个特定位置.最常用锚元素是 ^, 它使模式依赖于开头,而锚元素$则使模式定位在末尾.
  例如:要匹配词 "javascript" ,我们可以使用正则表达式 /^ javascript $/. 如果我们想检索 "java" 这个词自身 (不像在 "javascript" 中那样作为前缀),那么我们可以使用模式 /\s java \s /, 它要求在词语java的前和的后都有空格.但是这样作有两个问题.第: 如果 "java" 出现在开头或者是结尾.该模式就不会和的匹配,除非在开头和结尾处有个空格. 第 2: 当这个模式找到个和的匹配时,它返回匹配串前端和后端都有空格,这并不是我们想要.因此,我们使用词语边界 \b 来代替真正空格符 \s 进行匹配. 结果表达式是 /\b java \b/.
下面是正则表达式:
含义
____________________________________________________________________
^ 匹配开头,在多行检索中,匹配开头
$ 匹配结尾,在多行检索中,匹配结尾
\b 匹配个词语边界.简而言的就是位于\w 和 \w的间位置(注意:[\b]匹配是退格符)
\B 匹配是非词语边界
_____________________________________________________________________
  6.属性
  有关正则表达式语法还有最后个元素,那就是正则表达式属性,它介绍说明是高级模式匹配规则.和其它正则表达式语法区别,属性是在 / 符号的外介绍说明.即它们不出现在两个斜杠的间,而是位于第 2个斜杠的后.javascript 1.2支持两个属性.属性 i 介绍说明模式匹配应该是大小写不敏感.属性 g 介绍说明模式匹配应该是全局.也就是说,应该找出被检索串中所有匹配.这两种属性联合起来就可以执行个全局,大小写不敏感匹配.
  例如: 要执行个大小不敏感检索以找到词语 "java" (或者是 "java" 、"JAVA"等) 个具体值,我们可以使用大小不敏感正则表达式 /\b java\b/i .如果要在串中找到 "java" 所有具体值,我们还可以添加属性 g, 即 /\b java \b/gi .
以下是正则表达式属性:
含义
_________________________________________
i 执行大小写不敏感匹配
g 执行个全局匹配,简而言的,就是找到所有匹配,而不是在找到第个的后就停止了
_________________________________________
  除属性 g 和 i 的外,正则表达式就没有其它像属性特性了.如果将构造 RegExp 静态属性 multiline 设置为 true ,那么模式匹配将以多行模式进行.在这种模式下,锚 ^ 和 $ 匹配不只是检索开头和结尾,还匹配检索串内部开头和结尾.例如: 模式 /Java$/ 匹配是 "Java",但是并不匹配"Java\nis fun" .如果我们设置了 multiline 属性,那么后者也将被匹配:
RegExp.multiline = true;
  正则表达式(regular expression)对象包含个正则表达式模式(pattern)它具有用正则表达式模式去匹配或代替个串()中特定(或集合)属性(properties)和思路方法(methods)要为个单独正则表达式添加属性,可以使用正则表达式构造(constructor function)无论何时被预设置正则表达式拥有静态属性(the pred RegExp object has properties that are whenever any regular expression is used, 我不知道我翻得对不对将原文列出请自行翻译)
创建:
个文本格式或正则表达式构造
文本格式: /pattern/flags
正则表达式构造: RegExp("pattern"[,"flags"]);
参数介绍说明:
pattern -- 个正则表达式文本
flags -- 如果存在将是以下值:
g: 全局匹配
i: 忽略大小写
gi: 以上组合
[注意] 文本格式参数不用引号而在用构造参数需要引号如:/ab+c/i RegExp("ab+c","i")是实现功能在构造些特殊需要进行转意(在特殊前加"\")如:re = RegExp("\\w+")
  正则表达式中特殊
含意
\ 做为转意即通常在"\"后面不按原来意义解释如/b/匹配"b"当b前面加了反斜杆后/\b/转意为匹配个单词边界
-或-
对正则表达式功能还原如"*"匹配它前面元0次或多次/a*/将匹配a,aa,aaa加了"\"后/a\*/将只匹配"a*"
^ 匹配个输入或开头/^a/匹配"an A"而不匹配"An a"
$ 匹配个输入或结尾/a$/匹配"An a"而不匹配"an A"
* 匹配前面元0次或多次/ba*/将匹配b,ba,baa,baaa
+ 匹配前面元1次或多次/ba*/将匹配ba,baa,baaa
? 匹配前面元0次或1次/ba*/将匹配b,ba
(x) 匹配x保存x在名为$1...$9变量中
x|y 匹配x或y
{n} 精确匹配n次
{n,} 匹配n次以上
{n,m} 匹配n-m次
[xyz] 集(character )匹配这个集合中(或元)
[^xyz] 不匹配这个集合中任何
[\b] 匹配个退格符
\b 匹配个单词边界
\B 匹配个单词非边界
\cX 这儿X是个控制符/\cM/匹配Ctrl-M
\d 匹配个字数/\d/ = /[0-9]/
\D 匹配个非字数/\D/ = /[^0-9]/
\n 匹配个换行符
\r 匹配个回车符
\s 匹配个空白包括\n,\r,\f,\t,\v等
\S 匹配个非空白等于/[^\n\f\r\t\v]/
\t 匹配个制表符
\v 匹配个重直制表符
\w 匹配个可以组成单词(alphanumeric这是我意译含数字)包括下划线如[\w]匹配"$5.98"中5等于[a-zA-Z0-9]
\W 匹配个不可以组成单词如[\W]匹配"$5.98"中$等于[^a-zA-Z0-9]

  说了这么多了我们来看些正则表达式实际应用例子:
E-mail地址验证:
function test_email(strEmail) {
var myReg = /^[_a-z0-9]+@([_a-z0-9]+\.)+[a-z0-9]{2,3}$/;
(myReg.test(strEmail)) true;
false;
}
HTML代码屏蔽
function mask_HTMLCode(strInput) {
var myReg = /<(\w+)>/;
strInput.replace(myReg, "<$1>");
}
正则表达式对象属性及思路方法
  预定义正则表达式拥有有以下静态属性:input, multiline, lastMatch, lastParen, leftContext, rightContext和$1到$9其中input和multiline可以预设置其他属性值在执行过exec或test思路方法后被根据区别条件赋以区别许多属性同时拥有长和短(perl风格)两个名字并且这两个名字指向同个值(JavaScript模拟perl正则表达式)
正则表达式对象属性 属性 含义
$1...$9 如果它(们)存在是匹配到子串
$_ 参见input
$* 参见multiline
$& 参见lastMatch
$+ 参见lastParen
$` 参见leftContext
$'          参见rightContext
constructor    创建个对象个特殊原型
global       是否在整个串中匹配(bool型)
ignoreCase     匹配时是否忽略大小写(bool型)
input        被匹配
lastIndex     最后次匹配索引
lastParen     最后个括号括起来子串
leftContext    最近次匹配以左子串
multiline     是否进行多行匹配(bool型)
prototype     允许附加属性给对象
rightContext    最近次匹配以右子串
source       正则表达式模式
lastIndex     最后次匹配索引
正则表达式对象思路方法
思路方法 含义
compile      正则表达式比较
exec        执行查找
test        进行匹配
toSource      返回特定对象定义(literal representing)其值可用来创建个新对象重载Object.toSource思路方法得到
toString      返回特定对象重载Object.toString思路方法得到
valueOf      返回特定对象原始值重载Object.valueOf思路方法得到
例子
将输出"Smith, John"
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: