JS正则中的match与exec使用说明

能,可以用 regexp 关键字来实现。

正则表达式定义了一个字符串的规则。最简单的正则表达式不包含任何保留字。例如,正则表达式hello只和字符串“hello”匹配。
一般的正则表达式使用了某些特殊的结构,所以它能匹配更多的字符串。例如,正则表达式hello|word既能匹配字符串“hello”也能匹配字符串“word”。举一个更复杂一点的例子,正则表达式b[an]*s可以匹配字符串“bananas”、“baaaaas”、“bs”以及其他任何以b开头以s结尾的字符串,中间可以包括任意个a和任意个n的组合。
一个正则表达式中的可以使用以下保留字 ^ 所匹配的字符串以后面的字符串开头
mysql>select”fonfo”regexp”^fo$”;->0
mysql>select”fofo”regexp”^fo”;->1 $
所匹配的字符串以前面的字符串结尾
mysql>select”fono”regexp”^fono$”;->1
mysql>select”fono”regexp”^fo$”;->0
mysql>select”fofo”regexp”^f.*”;->1
mysql>select”fonfo”regexp”^f.*”;->1 a* 匹配任意多个a
mysql>select”ban”regexp”^ba*n”;->1
mysql>select”baaan”regexp”^ba*n”;->1
mysql>select”bn”regexp”^ba*n”;->1 a+ 匹配任意多个a
mysql>select”ban”regexp”^ba+n”;->1
mysql>select”bn”regexp”^ba+n”;->0 a? 匹配一个或零个a
mysql>select”bn”regexp”^ba?n”;->1
mysql>select”ban”regexp”^ba?n”;->1
mysql>select”baan”regexp”^ba?n”;->0 de|abc 匹配de或abc
mysql>select”pi”regexp”pi|apa”;->1
mysql>select”axe”regexp”pi|apa”;->0
mysql>select”apa”regexp”pi|apa”;->1 mysql>select”apa”regexp”^
mysql>select”pi”regexp”^ mysql>select”pix”regexp”^
mysql>select”pi”regexp”^ mysql>select”pip”regexp”^
mysql>select”pipi”regexp”^ {1} {2,3}
这是一个更全面的方法,它可以实现前面好几种保留字的功能 a* 可以写成a{0,}
a+ 可以写成a{1,} a? 可以写成a{0,1}
在{}内只有一个整型参数i,表示字符只能出现i次;在{}内有一个整型参数i,后面跟一个“,”,表示字符可以出现i次或i次以上;在{}内只有一个整型参数i,后面跟一个“,”,再跟一个整型参数j,表示字符只能出现i次以上,j次以下。其中的整型参数必须大于等于0,小于等于re_dup_max。如果有两个参数,第二个必须大于等于第一个
[a-dx] 匹配“a”、“b”、“c”、“d”或“x” [^a-dx]
匹配除“a”、“b”、“c”、“d”、“x”以外的任何字符。“[”、“]”必须成对使用
mysql>select”axbc”regexp”[a-dxyz]”;->1
mysql>select”axbc”regexp”^[a-dxyz]$”;->0
mysql>select”axbc”regexp”^[a-dxyz]+$”;->1
mysql>select”axbc”regexp”^[^a-dxyz]+$”;->0
mysql>select”gheis”regexp”^[^a-dxyz]+$”;->1

主要参考W3C教程

比如:我想搜索 admin 表中 username 字段为数字的记录。则可以使用下面的
SQL 语句:

mysql>select”gheisa”regexp”^[^a-dxyz]+$”;->0

[[.characters.]]
表示比较元素的顺序。在括号内的字符顺序是唯一的。但是括号中可以包含通配符,所以他能匹配更多的字符。举例来说:正则表达式[[.ch.]]*c匹配chchcc的前五个字符。
[=character_class=]
表示相等的类,可以代替类中其他相等的元素,包括它自己。例如,如果o和是一个相等的类的成员,那么[[=o=]]、[[=]是完全等价的。
[:character_class:]
在括号里面,在[:和:]中间是字符类的名字,可以代表属于这个类的所有字符。
字符类的名字有:alnum、digit、punct、alpha、graph、space、blank、lower、upper、cntrl、print和xdigit
mysql>select”justalnums”regexp”[[:alnum:]]+”;->1
mysql>select”!!”regexp”[[:alnum:]]+”;->0 [[::]]
分别匹配一个单词开头和结尾的空的字符串,这个单词开头和结尾都不是包含在alnum中的字符也不能是下划线。
mysql>select”aworda”regexp”[[::]]”;->1
mysql>select”axworda”regexp”[[::]]”;->0
mysql>select”weeknights”regexp”^$”;->1

String.match()

select * from articles where title regexp [0-9].+;

match() 方法将检索目标字符串,以找到一个或多个与
正则表达式regexp 匹配的文本。match()有两种情况:

<!–[if !supportLists]–>1、
<!–[endif]–>如果 regexp 具有标志
g,则 match()
方法将执行全局检索,找到目标字符串中的所有匹配子字符串。

匹配情况

返回值

没有找到任何匹配的子串

null

找到了一个或多个匹配子串

一个数组。数组的内容包含所有的匹配子串

下面是个实例:

复制代码 代码如下:

var str = ‘xxtest00test11test22test’
regexp = new RegExp(/(test)(.{1})/g);
while((result = regexp.exec(str)) != null){
document.write(result + ‘<br />’);
document.write(regexp.lastIndex+ ‘<br />’);
}

匹配的结果如下:

返回的匹配数组:

[testaa,testbb,testcc]
并且数组不包含其他有关匹配的信息:

   0:testaa
   1:testbb
   2:testcc

<!–[if !supportLists]–>2、
<!–[endif]–>如果 regexp 没有标志 g,那么 match()
方法就只能目标字符串中执行一次匹配。

匹配情况

返回值

没有找到任何匹配的子串

null

找到了一个或多个匹配子串

一个数组。数组的内容包含与它找到的匹配文本有关的信息。该数组的第 0 个元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本。除了这些常规的数组元素之外,返回的数组还含有两个对象属性。index 属性声明的是匹配文本的起始字符在目标字符串中的位置,input 属性声明的是对目标字符串的引用。

我们把上面例子的全局标志g拿掉,regexp = new RegExp(/(test)(.{1})/);再次得到的匹配结果如下:

返回的匹配数组:

[test0,test,0]
并且数组包含index和input信息:

0:test0
1:test
2:0
index:2
input:xxtest0test1test2test

不过有一点需要说明的是,在IE6,7,8下,返回的数组同时包含lastIndex信息,用来表示表示匹配子串的下一个位置。话说这个属性应该是在regexp上面的,所以在IE9里面去掉了。

String.exec()**方法:**

<!–[if !supportLists]–>1、
<!–[endif]–>如果 regexp
不具有标志 g。

匹配情况

返回值

没有找到任何匹配的子串

null

找到了一个或多个匹配子串

一个数组。数组的内容与调用match() 返回的数组是相同的。

沿用上面的例子:

复制代码 代码如下:

result = regexp.exec(str);

返回的匹配数组:
[test0,test,0]
并且数组包含index和input信息:
0:test0
1:test
2:0
index:2
input:xxtest0test1test2test
同样,在IE6,7,8下,返回的数组同时包含lastIndex信息。
<!–[if !supportLists]–>2、 <!–[endif]–>如果 regexp
具有标志 g。
它会在 regexp的 lastIndex 属性指定的字符处开始检索。当 exec()
找到了与表达式相匹配的文本时,在匹配后,它将把 regexp的 lastIndex
属性设置为匹配文本的最后一个字符的下一个位置。这就是说,可以通过反复调用
exec() 方法来遍历字符串中的所有匹配文本。当 exec()
再也找不到匹配的文本时,它将返回 null,并把 lastIndex 属性重置为 0。
注:无论 RegExpObject 是否是全局模式,exec()
都会把完整的细节添加到它返回的数组中。这就是 exec() 与 match()
的不同之处,后者在全局模式下返回的信息要少得多。如果要获得所有的匹配细节,就可以在全局模式下循环调用exec()方法。
类似:

复制代码 代码如下:

var str = ‘xxtest00test11test22test’
regexp = new RegExp(/(test)(.{1})/g);
while((result = regexp.exec(str)) != null){
document.write(result + ‘<br />’);
document.write(regexp.lastIndex+ ‘<br />’);
}

对于lastIndex属性的说明:
<!–[if !supportLists]–>(1)
<!–[endif]–>lastIndex在regexp上面,而不是返回的数组结果里面,IE6,7,8在match()方法的lastIndex实现上有bug。
<!–[if !supportLists]–>(2)
<!–[endif]–>如果在一个字符串中完成了一次模式匹配之后要开始检索新的字符串,就必须手动地把
lastIndex 属性重置为 0。

String.match() match()
方法将检索目标字符串,以找到一个或多个与 正则表达式 regexp 匹配的文本。
match() 有两种情况: !–[i…

发表评论

电子邮件地址不会被公开。 必填项已用*标注