正则表达式中的奇怪东西 \b ?: ?=

关于正则表达式的“\b”

今天刚刚开始看正则表达式就遇到一个十分头疼的问题,原文是这样的:

“不幸的是,很多单词里包含hi这两个连续的字符,比如him,history,high等等。用hi来查找的话,这里边的hi也会被找出来。如果要精确地查找hi这个单词的话,我们应该使用\bhi\b。

\b是正则表达式规定的一个特殊代码(好吧,某些人叫它元字符,metacharacter),代表着单词的开头或结尾,也就是单词的分界处。虽然通常英文的单词是由空格,标点符号或者换行来分隔的,但是\b并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置”

问题来了,什么叫只匹配一个位置????

 

要知道是一个单词的开头,这个\b是去匹配开头的分隔符还是匹配开头的第一个字母??

 

从网上找到了这样一句话:“如果需要更精确的说法,\b匹配这样的位置:它的前一个字符和后一个字符不全是(一个是,一个不是或不存在)\w(匹配字母或数字或下划线或汉字)”

 

这 句话很隐晦的说出了是去匹配第一个字母,而不是去匹配分割符(我这说的匹配分隔符和上边说的不去匹配任何一个分隔符并不矛盾,因为我经过实验已经进本猜出 了一个单词两边只要没有数字、字母、汉字、下划线就可以认为是独立单词,我说的匹配分隔符是去判断单词前一个字符是不是在这四个之外,是的话就认为是单词 开头)

 

再加上下边的两个例子就可以很清晰的理解这句很隐晦的话。

引用Microsoft   VBScript   Regular   Expression  

Dim myReg As RegExp

Set myReg = New RegExp

 

myReg.Pattern = "a\b.*h.*"

Print myReg.Test("a,chia")

输出的结果为Ture 说明是匹配的a,而不是,

Dim myReg As RegExp

Set myReg = New RegExp

 

myReg.Pattern = "a.* \b h.*"

Print myReg.Test("a,chia")

输出的结果为flash 说明匹配的是h,而不是c

 

关于正则表达式的“?:”

正常情况(X)中的X会被作为新增的一个组序号输出,比如(A)(B),A的序号1,B的序号2

如果(?:A)(B),A将没有序号不输出,B的序号为1

例:

var a=/(tt)(uu)/
alert('ttuu'.match(a))

输出结果 ttuu,tt,uu

 

var a=/(?:tt)(uu)/
alert('ttuu'.match(a))

输出结果 ttuu,uu

正则表达式中?=和?!的理解

要理解?=和?!,首先需要理解前瞻,后顾,负前瞻,负后顾四个概念:

前瞻:
exp1(?=exp2) 查找exp2前面的exp1
后顾:
(?<=exp2)exp1 查找exp2后面的exp1
负前瞻:
exp1(?!exp2) 查找后面不是exp2的exp1
负后顾:
(?<!=exp2)exp1 查找前面不是exp2的exp1


举例:

"中国人".replace(/(?<=中国)人/, "rr") // 匹配中国人中的人,将其替换为rr,结果为 中国rr
"法国人".replace(/(?<=中国)人/, "rr") // 结果为 法国人,因为人前面不是中国,所以无法匹配到
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值