不会的增则

cat或者cut的状况,正则表达式写作『c[au]t』 正则表达式

uharonducour。 正则表达式为『c(u|har|onduc|our)t』 spa

若是要匹配的单词是 c开头、t结尾,中间有一个字符,但不能是u(也就是说,整个单词不能是cut),直接用『c[^u]t』

咱们回头仔细看看这个“非”的逻辑,咱们发现,其实咱们要否认的是“单个出现的a或u”,而不单单是“出现的a或u”,因此才出现这样的问题,要解决这个问题,就应当把意思准确表达出来,变成“在结尾的t以前,不允许只出现一个a或u”。想到这一步,咱们就能够用否认顺序环视『(?!…)』来解决了,它表示“在这个位置向右,不允许出现子表达式可以匹配的文本,咱们把子表达式规定为『[au]t\b』(最后的『\b』很重要,它出如今t以后,保证t是单词的结尾子母)。 字符串

有了这点限制,匹配a和t之间文本的表达式就随意不少了,咱们能够用匹配单词字符的简记法『\w』表示,因而整个表达式就变成了『c(?![au]t\b)\w+t』。请注意,这里出现的并非排除型字符组『[^au]』,而是普通的字符组『[au]』,由于否认顺序环视『(?!…)』自己已经表示了“否认”的功能。 原理

若是咱们再进一步,“整个匹配文本中都不能出现字符串cat”,要怎么办呢?许多人的思路就是借鉴处理“或”关系的思路:既然字符组对应单个字符的状况,多选分支对应多个字符的状况,那么在否认时也是这样。惋惜,正则表达式并无提供与多选分支对应的“否认”结构,那么,应该怎么办呢? im

解决的办法仍是得依靠否认顺序环视——“整个匹配文本中都不能出现字符串cat”,换句话说,就是“在文本中的任意位置,向右,都不能出现该字符串”。所以,咱们用两个锚点『^』和『$』,分别匹配整个字符串的开头和结尾位置,再用否认顺序环视『(?!cat)』表达“不能出现字符串cat”。 co

即使知道了原理,也不见得能写对正则表达式,好比『^(?!cat).+$』就是不正确的,由于它只限定了在文本的开头(也就是『^』)右边不能出现cat,而咱们真正要作的是,在文本的每个位置右边,都不能出现cat,因此应该改为『^((?!cat).)+$』;但这还说不上完美,根据前面提到的关于括号捕获的知识,由于此处并不须要括号捕获的文本,因此最好使用非捕获型括号『(?:…)』,最终咱们获得的表达式就是『^(?:(?!cat).)+$』。 字符

匹配多行

(?ms) background

相关文章
相关标签/搜索