为了账号安全,请及时绑定邮箱和手机立即绑定

在线等!请问正则(\/?)与[\/]?(\/)?什么区别

/ 猿问

在线等!请问正则(\/?)与[\/]?(\/)?什么区别

三国纷争 2019-09-13 11:05:12
请问正则(\/?)与[\/]?与(\/)?什么区别
                    
查看完整描述

2 回答

?
暮色呼如
都是匹配零个或者一个/
区别
(\/?)和(\/)?。前者的数量修饰符?(零个或一个)是只针对于括号内的一部分,后者的数量修饰符针对于整个子表达式(括号内定义的被称作子表达式)。例子:(\/?\/)会匹配//或者/,(\/\/)?会匹配零个或者一个//。
[\/]?和其他两个。[]被称为字符集合,比如[\/\\]?在字符集合内定义了/和\,表示匹配零个或一个/或\。其他两个所使用的()被称为子表达式或分组匹配,子表达式在匹配时会被作为一个整体看待,而不是像字符集合只要满足集合内其中一个就行。比如[\/\\]匹配/或\,(\/\\)匹配/\。
                            
查看完整回答
反对 回复 2019-09-13
?
一只甜甜圈
这个问题比较复杂,听我婉婉道来(当然推荐你先看下基础教程再来看我个人的分析--->正则教程)
首先这个问题拆分成三部分
\/的含义
()和[]的区别
?在()里外的区别
解答
1.\/的含义---转义符
解释:
依照下列规则匹配:在非特殊字符之前的反斜杠表示下一个字符是特殊字符,不能按照字面理解。例如,前面没有""的"b"通常匹配小写字母"b",即字符会被作为字面理解,无论它出现在哪里。但如果前面加了"",它将不再匹配任何字符,而是表示一个字符边界。
在特殊字符之前的反斜杠表示下一个字符不是特殊字符,应该按照字面理解。详情请参阅下文中的"转义(Escaping)"部分。
如果你想将字符串传递给RegExp构造函数,不要忘记在字符串字面量中反斜杠是转义字符。所以为了在模式中添加一个反斜杠,你需要在字符串字面量中转义它。/[a-z]s/i和newRegExp("[a-z]\s","i")创建了相同的正则表达式:一个用于搜索后面紧跟着空白字符(s可看后文)并且在a-z范围内的任意字符的表达式。为了通过字符串字面量给RegExp构造函数创建包含反斜杠的表达式,你需要在字符串级别和表达式级别都对它进行转义。例如/[a-z]:\/i和newRegExp("[a-z]:\\","i")会创建相同的表达式,即匹配类似"C:"字符串。
简单来说转义符就是保留特殊符号,这里的\/就是匹配/的意思(因为正则是\xxxx\,其中\符号表示开始与结束,具有特殊意义,需要转义).当然还有一些特殊用法,这里就不做展开.
2.()和[]的区别
()的解释
像下面的例子展示的那样,它会匹配'x'并且记住匹配项。其中括号被称为捕获括号。模式/(foo)(bar)12/中的'(foo)'和'(bar)'匹配并记住字符串"foobarfoobar"中前两个单词。模式中的1和2表示第一个和第二个被捕获括号匹配的子字符串,即foo和bar,匹配了原字符串中的后两个单词。注意1、2、...、n是用在正则表达式的匹配环节,详情可以参阅后文的n条目。而在正则表达式的替换环节,则要使用像$1、$2、...、$n这样的语法,例如,'barfoo'.replace(/(...)(...)/,'$2$1')。$&表示整个用于匹配的原字符串。
[]的解释
一个字符集合。匹配方括号中的任意字符,包括转义序列。你可以使用破折号(-)来指定一个字符范围。对于点(.)和星号(*)这样的特殊符号在一个字符集中没有特殊的意义。他们不必进行转义,不过转义也是起作用的。例如,[abcd]和[a-d]是一样的。他们都匹配"brisket"中的‘b’,也都匹配“city”中的‘c’。/[a-z.]+/和/[w.]+/与字符串“test.i.ng”匹配。
所以如果你的()和[]中只有一个符号的话,那是没有匹配区别,只有是否被捕获的区别(你问题中没有后续的正则,所以就不展开解释什么是捕获了).
3.?在()里外的区别
先解释下?的用途
匹配前面一个表达式0次或者1次。等价于{0,1}。例如,/e?le?/匹配"angel"中的'el'、"angle"中的'le'以及"oslo'中的'l'。
如果紧跟在任何量词*、+、?或{}的后面,将会使量词变为非贪婪(匹配尽量少的字符),和缺省使用的贪婪模式(匹配尽可能多的字符)正好相反。例如,对"123abc"使用/d+/将会匹配"123",而使用/d+?/则只会匹配到"1"。
还用于先行断言中,如本表的x(?=y)和x(?!y)条目所述。
这里断言比较复杂,就不展开,暂时先看第一条解释就行,?匹配0次或1次.
如果在()里面,比如例子(\/?)即匹配\/也就是/符号0次或1次,并将其作为一个捕获.
如果在()外面,比如例子(\/)?即先将\/作为一个捕获,再匹配\/也就是/符号0次或1次.
具体区别,如果你后续没有使用捕获的特性(比如\n来匹配第N次捕获,具体用法自己查看上述链接),在本题中就没有区别.
如果是(12?)和(12)?相比较,那么(12?)匹配1或12(12)?匹配空或12
以上time
                            
查看完整回答
反对 回复 2019-09-13

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信