RE

编写规则表达式模型

 

请参阅

  一个规则表达式模型由简单字符组成(如 /abc/)或简单和复杂字符的组合(如 /ab*c/ 或 /Chapter (/d+)/./d*/)。

简单模型
简单模型由您希望得到一个直接匹配字符所构成,如:模型 /abc/ 匹配仅仅当字符 'abc' 同时出现在一个字符串中且按同一顺序时。
特殊字符
当搜索一个匹配需要的要素不再是直接匹配时,如搜索一个或多个 b 或搜索空白(whitespace),那么该模型就包含特殊字符。如模型 /ab*c/ 匹配任何字符串—包含一个单字符 'a' 后跟0个或多个 'b' (* 意味着可有0或多少次)然后紧跟着 'c',如字符 "cbbabbbbcdebc",该模型匹配子字符串 "abbbbc"。

下面是能用于规则表达式的特殊字符列表及描述:

字符 描  述
/ 有以下两种:
  • 字符通常按字面处理,指示下一个为特殊字符不必完全按字面解释;如:/b/ 匹配字符 'b',通过在字符 b 前放置反斜杠,即 //b/,字符就成为特殊并匹配一个单词边界
  • 指示下一个字符不是特殊字符并按字面解释;如: * 是一个特殊字符意味着前0个或多字符将匹配,如 /a*/ 意味着匹配 0 或更多的 a,为了按字面匹配 *,需在其前加反斜杠(如 /a/*/ 匹配 'a*')。
^ 匹配输入或行的开始,如 /^A/ 不匹配 "an A" 中的字符 'A',但匹配 "An A"
$ 匹配输入或行的结尾,如 /t$/ 不匹配 "eater" 中的字符 't',但匹配 "eat"
* 匹配前0个或多个字符,如 /bo*/ 匹配 "A ghost booooed" 中的 'boooo' 和 "A bird warbled" 的 'b',但在 "A goat grunted" 中无匹配
+ 匹配前1个或多个字符,等价于 {1,},如 /a+/ 匹配 "candy" 中的字符 'a',以及 "caaaaaaandy" 中的所有 a
? 匹配前0个或1个字符,如 /e?le?/ 匹配 "angel" 中的 'el',以及 "angle" 中的 'le'
. 匹配任何单一字符除了换行符,如 /.n/ 在语句 "nay, an apple is on the tree" 中匹配 'an' 和 'on' ,但不匹配 'nay'
(x) 匹配 'x' 并存储该匹配,如:在语句 "foo bar." 中 /(foo)/ 匹配并存储 'foo',该匹配子串可以被数组元素 [1], ..., [n] 中调用,或从预定义 RegExp 对象属性 $1, ..., $9 中调用。
x|y 匹配 'x' 或'y',如:/green|red/ 匹配语句 "green apple" 中的 'green',以及语句 "red apple" 中的 'red'
{n}

n 是一个正整数,精确匹配前 n 个出现的字符,如:/a{2}/ 并不匹配 "candy" 中的字符 'a',但它匹配 "caandy" 中的两个 a,以及 "caaandy" 中的第一和第二个字符 a。

{n,} n 是一个正整数,匹配至少前 n 个出现的字符,如:/a{2,}/ 不匹配 "candy" 的字符 'a',但匹配 "caandy" 和 "caaaaaaandy" 中所有的字符 'a'。
{n,m} n 和 m 是一个正整数,匹配至少前 n 个但最多 m 个的字符,如:/a{1,3}/ 在 "cndy" 中无匹配,而匹配 "candy" 中的 'a'、 "caandy" 中的第一和第二个 'a',以及 "caaaaaaandy" 中第一到第三个 'a'(即 "aaa"),虽然原始字符串中有更多个字符 'a'。
[xyz] 一个字符集合,匹配任一内附的字符,您也可以用连接符指定一个字符范围,如:[abcd] 等同于 [a-d]。它可以匹配 "brisket" 中的 'b' 和 "ache" 中的 'c'。
[^xyz] 一个负数或补码字符集合,它匹配没有内附在方框号中的任何字符,同样您也可以用连接符指定一个字符范围,如:[^abc] 等同于 [^a-c],它可以匹配 "brisket" 中的 'r',但不匹配其中的 'b'。
[/b] 匹配一个退格 backspace(不要同 /b 搞混淆)
/b 匹配一个单词边界(字符串中各字符的分界,如空白和换行符),如://bn/w/ 匹配 "noonday" 中的 'no' ,//wy/b/ 匹配 "possibly yesterday" 中的 'ly'。
/B 匹配一个非单词边界,如://w/Bn/ 匹配 "noonday" 中的 'on',/y/B/w/ 匹配 "possibly yesterday" 中的 'ye'。
/cX 此处 X 为一个控制字符,它匹配字符串的控制字符,如 //cM/ 匹配字符串中的 control-M。
/d 匹配一个数字符,等同于 [0-9],如://d/ 或 /[0-9]/ 均匹配 "B2 is the suite number" 中的 '2'。
/D 匹配任何非数字符,等同于 [^0-9],如://D/ 或 /[^0-9]/ 匹配 "B2 is the suite number" 中的 'B'。
/f 匹配换页符
/n 匹配换行符
/r 匹配回车符
/s 匹配一个单独空白字符,包括空格、制表符、换页、换行,等同于 [ /f/n/r/t/v],如://s/w*/ 匹配 "foo bar" 中的 ' bar'。
/S 同上面相反,它匹配除了空白符外的单一字符,等同于 [^ /f/n/r/t/v],如://S/w*/ 匹配 "foo bar" 中的 'foo'。
/t 匹配一个制表符
/v 匹配一个垂直制表符
/w 匹配任何包含下划线的字母和数字字符,等同于 [A-Za-z0-9_],如://w/ 匹配 "apple" 中的 'a',"$5.28" 是的 '5' 和 "3D" 中的 '3'。
/W 匹配任何非字母和数字符,等同于 [^A-Za-z0-9_],如://W/ 或 /[^$A-Za-z0-9_]/ 匹配 "50%" 中的 '%'。
/n n 是一个正整数,返回存储的匹配引用,如:/apple(,)/sorange/1/ 匹配 "apple, orange, cherry, peach" 中的 'apple, orange,'。
注意:如果左边的括号少于 /n 中指定的数字,/n 作为一个八进制转义字符(见下行)
/ooctal
/xhex
/ooctal 是一个八进制转义字符值,/xhex 是一个十六进制转义字符值,允许您植入一个 ASCII 码到规则表达式。
圆括号的使用

圆括号包围规则表达式的任一部位,以便匹配子串的一部分可以进行存储,这样该子串就可以被别的对象所调用,请参见圆括号子串匹配。

JavaScript 教学
用规则表达式工作

 


请参阅

  规则表达式用 RegExp 的 test 和 exec 方法以及 String 的 match、replace、search 和 split 方法进行工作,这些方法将在 中进行祥述。

方法 描    述
exec 在字符串中执行搜索一个匹配的 RegExp 方法,它返回查找结果的数组
test 在字符串中测试一个匹配的 RegExp 方法,返回 true 或 false
match 在字符串中执行搜索一个匹配的 String 方法,返回一个信息的数组或错配后返回一个 null
search 在字符串中测试一个匹配的String 方法,返回匹配的索引,或错配后返回 -1
replace 在字符串中执行搜索一个匹配的 String 方法,并用另一个替换的该匹配的子串
split 一个 String 方法,用规则表达式或一个固定字符串分离为子串的数组

下例中用 exec 方法在一个字符串中搜索一个匹配:

<SCRIPT LANGUAGE="JavaScript1.2">
 myRe=/d(b+)d/g;
 myArray = myRe.exec("cdbbdbsbz");
</SCRIPT>

如果您不需要访问规则表达式的属性,可以用下面的方法来代替:

<SCRIPT LANGUAGE="JavaScript1.2">
 myArray = /d(b+)d/g.exec("cdbbdbsbz");
<SCRIPT>

如果您希望能重编译规则表达式,也可以用下面的方法替换:

<SCRIPT LANGUAGE="JavaScript1.2">
 myRe= new RegExp ("d(b+)d", "g:);
 myArray = myRe.exec("cdbbdbsbz");
<SCRIPT>

上面的脚本成功进行了匹配,并返回数组和更新了下表中的属性:

对象 属性或索引 描  述 本例
myArray   匹配的字符串并存储子串 ["dbbd", "bb"]
index 从零开始的字符串匹配索引 1
input 原始字符串 "cdbbdbsbz"
[0] 最后匹配字符 "dbbd"
myRe lastIndex 开始下一个匹配的索引 (该属性仅在用 g 选项时有效,请参见通用搜索章节) 5
source 模型的文本 "d(b+)d"
RegExp lastMatch 最后匹配字符 "dbbd"
leftContext 匹配前最首个子串 "c"
rightContext 匹配后的首个子串 "bsbz"

RegExp.leftContextRegExp.rightContext 可以用另外的值计算,RegExp.leftContext 等同于:

myArray.input.substring(0, myArray.index)

RegExp.rightContext 等同于:

myArray.input.substring(myArray.index + myArray[0].length)

正如第二个例子,您可以不用给变量赋值的对象初始化程序创建一个规则表达式,但这样您将不能访问规则表达式的属性,如下:

<SCRIPT LANGUAGE="JavaScript1.2">
 myRe=/d(b+)d/g;
 myArray = myRe.exec("cdbbdbsbz");
 document.writeln("The value of lastIndex is" + myRe.lastIndex);
</SCRIPT>

该脚本显示:lastIndex 的值为 5,但如果您用下面的脚本:

<SCRIPT LANGUAGE="JavaScript1.2">
 myArray = /d(b+)d/g.exec("cdbbdbsbz");
 document.writeln("The value of lastIndex is " + /d(b+)d/g.lastIndex);
</SCRIPT>

lastIndex 显示的值为 0。

这两个语句中的 /d(b+)d/g 是两个不同的规则表达式,因此有不同的 lastIndex 属性值。

圆括号在子串匹配的作用

  在一个规则表达式中使用圆括号将使会存储对应的子串,如:/a(b)c/ 匹配字符 'abc' 并存储 'b',您可以用 RegExp 属性 $1, ..., $9 或数组元素 [1], ..., [n] 来调用它,请看下面的例子:

例一:

<SCRIPT LANGUAGE="JavaScript1.2">
 re = /(/w+)/s(/w+)/;
 str = "John Smith";
 newstr = str.replace(re, "$2, $1");
 document.write(newstr)
</SCRIPT >

它将显示 "Smith, John"。

例二:

<HTML>
<SCRIPT LANGUAGE="JavaScript1.2">
function getInfo(){
 re = /(/w+)/s(/d+)/
re.exec();
window.alert(RegExp.$1 + ", your age is " + RegExp.$2);
}
</SCRIPT>
Enter your first name and your age, and then press Enter.
<FORM>
<INPUT TYPE="text" NAME="NameAge" onChange="getInfo(this);">
</FORM>
</HTML>

上例中,RegExp.input 由 Change 事件所设置,在 getInfo 函数中,exec 方法用 RegExp.input 值作为它的参数。

例三:

<HTML>
<SCRIPT LANGUAGE="JavaScript1.2">
function getInfo(){
a = /(/w+)/s(/d+)/();
window.alert(a[1] + ", your age is " + a[2]);
}
</SCRIPT>

Enter your first name and your age, and then press Enter.
<FORM>
<INPUT TYPE="text" NAME="NameAge" onChange="getInfo(this);">
</FORM>
</HTML>

例三同例二结果完全相同。

通配搜索和忽略大小写

  规则表达式有两个选项标记,以允许通配和忽略大小进行搜索。进行通配用 g 标记,忽略大小写搜索用 i 标记,如下:

<SCRIPT LANGUAGE="JavaScript1.2">
re = //w+/s/g;
 str = "fee fi fo fum";
myArray = str.match(re);
document.write(myArray);
</SCRIPT>

它将显示 ["fee ", "fi ", "fo "]。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值