作为量词,表示 0 次或 1 次匹配。 位于量词后面用于改变量词的贪婪特性。...(查阅量词) * 量词,0 次或多次匹配 + 量词,1 次或多次匹配 {自定义量词开始标记 }自定义量词结束标记 \s匹配任意的空白符,包括空格,制表符,换行符 [^\s]代表非空白符...* 量词,0 次或多次匹配 + 量词,1 次或多次匹配 正则表达式中每个元字符匹配一个字符, 当使用 + 之后将会变的贪婪, 它将匹配尽可能多的字符, 但使用问号 ?..., $match); echo $match[0]; //结果为:010-12345678 懒惰模式:在可匹配与可不匹配的时候,优先不匹配 $p = '/\d?...表示匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。 也就是说, .
_],相当于[^\w] 量词 {n} 表示其前面的原子刚好出现了n次。...模式单元 {} 匹配其中的整体为一个原子 修正模式 贪婪匹配 匹配结果存在歧义时取其长(默认) 懒惰匹配 匹配结果存在歧义时取其短,只需在正则表达式的后面'/'加上'U',例如'/[0-9...flags: 可以设置为PREG_OFFSET_CAPTURE,使用搜索结果的第0个元素为匹配的字符串,第1个元素为对应的偏移量(位置) offset: 搜索从目标字符串的起始位置开始匹配。...返回值:匹配次数 类似函数preg_match_all,参数与preg_match一致 区别: preg_match:只匹配一次,搜索结构match的数据结果为一维数组 preg_match_all...] ) : array $pattern:要搜索的模式,字符串形式 $input:输入数组 flags:如果不设置则返回匹配的数目,设置PREG_GREP_INVERT则返回不匹配的数目。
exp),该含义为匹配表达式exp,并将其命名为name,后面的匹配中可以用\k表示匹配到的内容。 例如,(?\d{4})\w?...4、懒惰匹配 1) 懒惰匹配表示匹配尽量少的内容,在匹配符后面加上一个?即可。*?表示重复任意次,但是尽可能的少重复;{10,}表示重复10次以上,但是尽可能少重复。其他数量词加上?...它的值将是0次(不匹配)或1次,因为preg_match()在第一次匹配后 将会停止搜索。...name=a&page=1重定向为test_a_1.html,在apache的.htaccess中,可以如下方式: RewriteEngine on RewriteRule index.html index.php...3、优先用preg_match/命中率最高的匹配项放最左侧 因为其匹配到就停止,而preg_match_all会把全部内容匹配完。
大多数计算机语言的正则表达式量词默认是贪婪的,要想使用懒惰量词在量词后面加?...match列表对象,如果匹配失败则返回None finditer():在输入字符串中查找所有匹配内容,如果匹配成功,则返回容纳match的可迭代对象,通过迭代对象每次可以返回一个match对象,如果匹配失败则返回...代码第②行的finditer()函数返回可迭代对象。...代码第①行split()函数中参数maxsplit和flags是默认的,分割的次数没有限制,分割结果是['AB', 'CD', 'EF']列表 代码第②行split()函数指定maxsplit为1,分割结果是...代码第①行sub()函数中参数count和flags都是默认的,替换的最大数量没有限制,替换结果是AB CD EF 代码第②行sub()函数指定count为1,替换结果是AB CD34EF 代码第③
{m,n} 是通用形式的量词,正则表达式还有三个常用量词,分别是 +、?、*。它们的形态虽然不同于 {m,n},功能却是相同的,因此也可以把它们理解为“量词简记法”。具体说明见下表。...匹配 9后面跟0个或1个9。数字9的行匹配前两个字符9,其它行不匹配。 mysql> select distinct regexp_substr(a,'99?')...对于上面的数据行,结果为: 第一感觉这是使用正则表达式的场景。只要将每对中括号连同其中的内容替换为单个字符,再用char_length函数求长度即可。...\\]', 'A')) order by r; \\[ 和 \\] 用于将中括号转义为普通字符。...跟在“*”后边用时,表示懒惰模式,就是匹配尽可能少的字符。这就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。a.*?b 匹配最短的以 a 开始,以 b 结束的字符串。
之后,引擎继续读取文本中的字符T和正则表达式中的第一个字符块<,匹配失败,引擎读取文本中的下一个字符h,还是失败,直到读取到第15个字符<,匹配成功。...然后引擎读取正则表达式中的[ou]字符块和文本中的/字符块,匹配失败,引擎重新从文本的第15个<之后开始读取字符,从正则表达式的开头读取字符块……直到引擎读到了终结符,查找结束,找到了一个字符串,开始于文本的第...1位,结束于文本的第4位。...但是计算机并不能,他只能一个一个可能性地试过去,他可能从重复次数为0开始尝试,0次不行就1次,1次不行就两次……,也有可能从最大的重复次数开始试,最大的不行就最大减一次……。...四、占有型量词 在贪婪型量词的后面加一个+就成了占有型量词,占有型量词让被修饰字符重复最大次数。乍一看和贪婪型量词没啥区别啊,其实少了三个字,尽可能。还是用上面的例子来说,此时正则表达式为.
从上面的描述过程中,可以看出,路走不通时,就会发生“回溯”。即,尝试匹配失败时,接下来的一步通常就是回溯。 道理,我们是懂了。那么JS中正则表达式会产生回溯的地方都有哪些呢?...此时我们不禁会问,如果当多个贪婪量词挨着存在,并相互有冲突时,此时会是怎样? 答案是,先下手为强!因为深度优先搜索。...3.2 惰性量词 惰性量词就是在贪婪量词后面加个问号。表示尽可能少的匹配,比如: var string = "12345";var regex = /(\d{1,3}?)...只匹配到一个字符"1",而后面的 \d{1,3}匹配了"234"。 虽然惰性量词不贪,但也会有回溯的现象。比如正则是: ? 目标字符串是"12345",匹配过程是: ?...贪婪量词“试”的策略是:买衣服砍价。价钱太高了,便宜点,不行,再便宜点。 惰性量词“试”的策略是:卖东西加价。给少了,再多给点行不,还有点少啊,再给点。 分支结构“试”的策略是:货比三家。
但此时显然是不对的,因为正则显示.*后面还应该有一个字符 [(`;?>]。...所以 NFA 就开始回溯,先吐出一个 a,输入变成第 5 步显示的 //aaaa,但仍然匹配不上正则,继续吐出 a,变成 //aaa,仍然匹配不上…… 最终直到吐出;,输入变成第 12 步显示的 <?...这里有个有趣的事情,就是 PHP 文档中,中英文版本的数值是不一样的: ? 我们应该以英文版为参考。 可见,回溯次数上限默认是 100 万。...那么,假设我们的回溯次数超过了 100 万,会出现什么现象呢?比如: ? 可见,preg_match 返回的非 1 和 0,而是 false。...其实如果我们仔细观察 PHP 文档,是可以看到 preg_match 函数下面的警告的: ? 如果用 preg_match 对字符串进行匹配,一定要使用===全等号来判断返回值,如: <?
String 使用正则或字符串分隔一个字符串,并将分隔后的子字符串存储为数组 常用特殊字符 将其后的特殊字符,转义为字面量 正则表达式标志修饰符 标志 描述 g 全局搜索 i 不区分大小写搜索 m...RegExp.$1...RegExp.$9,存放括号中匹配的项 var re = /(\de(l.))...1,2, offset : 匹配到的子字符串在原字符串中的偏移量 string : 被匹配的原字符串 var str = "吃葡萄不吐putao皮,不吃putao倒吐葡萄皮~"; var str2 =...溯游从之,宛在水中央 回溯是正则匹配的基础组成部分,但代价也很昂贵,尽量减少其使用频率,才能编写高效的表达式 正则表达式扫描目标注字符串时,从左到右逐个测试其组成部分,看是否能找到匹配项 对每个量词(诸如...,成功 匹配空格,成功 匹配t,失败 尝试2中的另一个分支,第一个字母的匹配都失败了 回退到第一个字母后面的位置,依次向右挨个字母重复上述匹配 知道第14个字母h,又匹配成功正则中第一个h 重复2至5的过程
[TOC] 优先级概念 正则符号的优先级: ()圆括号因为是内存处理所以第1 * ?...+ { } 重复匹配内容第2 ^ $ \b 边界处理第3 | 条件处理第4 最后按照运算顺序计算匹配 常用的修正符 i (PCRE_CASELESS)正则内容在匹配时候不区分大小写(默认是区分的)。...如preg_match('/\[TOC\]/i',$str) 这句话中的小写字母i,他跟在正则表达式后面,起的作用是匹配时忽略大小写 所以,上述正则表达式可以匹配诸如 [toc]、[ToC]、或者[TOC...本修正符反转了匹配数量的值使其不是默认的重复,而变成在后面跟上“?”才变得重复。这和 Perl 不兼容。也可以通过在模式之中设定 (?U) 修正符来启用此选项。...X (PCRE_EXTRA) 此修正符启用了一个PCRE中与Perl不兼容的额外功能。模式中的任何反斜线后面跟上一个没有特殊意义的字母导致一个错误,从而保留此组合以备将来扩充。
按图中的匹配模式匹配时,捕获组的123号分别是红绿蓝。 捕获组的忽略与命名 我们还可以阻止PHP为匹配组的编号:在匹配组中模式前加 ?: $mode = '/a=(\d+)b=(?...4' (length=1) 2 => string '56' (length=2) 当然,我们也可以在括号的内部为它给它独特的名字。...length=2) 在保留索引数组的同时,加上一个关联项,key值为捕获组名。...捕获组的反向引用 我们在用preg_replace()函数进行正则替换时,我们还可以使用 \n 或 $n 来引用第n个捕获组....,$rp,$str);//**4/98/56/** \1表示捕获组1(4),$2为捕获组2(98),\3为捕获组3(56)。
输出中的换行和缩进是为了可读而增加的。 注意第1个字符串中所有出现 John 后跟一个单词 的地方,都被替换为 Joe Blocks 。第2个字符串中,只有第一个出现的被替换。...注意其中的行首和行尾标志,表示不能有任何文本在文本的前面后后面,只能是行首和行尾。 完整的匹配边界列表,在本文最后列出。 量词匹配 量词可以匹配一个表达式多次出现。...A* 量词 * 表示0次或多次。+ 表示1次或多次。? 表示0次或1次。还有些其他量词,参见本文后面的列表。 量词匹配分为 饥饿模式,贪婪模式,独占模式。饥饿模式 匹配尽可能少的文本。...跟在后面,表示 * 采用饥饿模式。 饥饿模式下,量词只会匹配尽可能少的字符,即0个字符。上例中的表达式将会匹配单词John,在输入文本中出现3次。...*+hurt *后跟+ 表示独占模式量词。 这个表达式在输入文本中没有匹配项,尽管文本中包括 John 和 hurt. 为什么会这样? 因为 .*+ 是独占模式。
输出中的换行和缩进是为了可读而增加的。 注意第1个字符串中所有出现 John 后跟一个单词 的地方,都被替换为 Joe Blocks 。第2个字符串中,只有第一个出现的被替换。...注意其中的行首和行尾标志,表示不能有任何文本在文本的前面后后面,只能是行首和行尾。 完整的匹配边界列表,在本文最后列出。 量词匹配 量词可以匹配一个表达式多次出现。...A* 量词 * 表示0次或多次。+ 表示1次或多次。? 表示0次或1次。还有些其他量词,参见本文后面的列表。 量词匹配分为 饥饿模式,贪婪模式,独占模式。饥饿模式 匹配尽可能少的文本。...跟在 后面,表示 * 采用饥饿模式。 饥饿模式下,量词只会匹配尽可能少的字符,即0个字符。上例中的表达式将会匹配单词John,在输入文本中出现3次。...*+hurt *后跟+ 表示独占模式量词。 这个表达式在输入文本中没有匹配项,尽管文本中包括 John 和 hurt. 为什么会这样? 因为 .*+ 是独占模式。
.); 松散连续意味着跟着的事件中,只有第一个可匹配的事件会被匹配上,而不确定的松散连接情况下,有着同样起始的多个匹配会被输出。...用这个例子来说明上面所说的连续性,一个模式序列"a b+ c"("a"后面跟着一个或者多个(不确定连续的)"b",然后跟着一个"c") 输入为"a","b1","d1","b2","d2","b3","...匹配的事件必须是直接跟在前面匹配到的事件后面(严格连续):Pattern next = start.next( Pattern....我们的模式选择函数为每个匹配的模式生成一个温度警告事件。
语句 boolean b = Pattern.matches("a*b", "aaaaab");等效于上面的三个语句,尽管对于重复的匹配而言它效率不高,因为它不允许重用已编译的模式。...Back 引用 是说在后面的表达式中我们可以使用组的编号来引用前面的表达式所捕获到的文本序列(是文本不是正则)。....* \1 其中使用了分组,\1就是对引号这个分组的引用,它匹配包含在两个引号或者两个单引号中的所有字符串,如,"abc" 或 " ' " 或 ' " ' ,但是请注意,它并不会对" a'或者 '...仅当子表达式 X 在 此位置的左侧匹配时才继续匹配。例如,(?<=19)99 与跟在 19 后面的 99 的实例匹配。此构造不会回溯。 (?<!X) 零宽度负后发断言。...仅当子表达式 X 不在此位置的左侧匹配时才继续匹配。例如,(?<!19)99 与不跟在 19 后面的 99 的实例匹配 说明: 非捕获组中四个表达式的区别: (?=X ) 和(?!
两个反斜杠导致了两次分支回溯,最后的双引号引起了两次回溯,第一次是因为与分支 [^\\"] 不匹配导致分支回溯,第二次是星号无法匹配引起的量词回溯。此时所有的多选分支都匹配失败,整个多选结构无法匹配。...如果每次都会不同,那么正则表达式每次都需要编译,完全不能重复利用。折中的优化措施就是检查插值后的结果(也就是正则表达式的具体值),只有当具体值发生变化时才重新编译。...(3)程序式处理中的编译缓存 在集成式处理中,正则表达式的使用与其在程序中所处的位置相关,所以再次执行这段代码时,编译好的正则表达式就能够缓存和重复使用。...所以这种优化的原理是,如果文字字符跟在忽略优先量词之后,只要引擎没有触及那个文字字符,忽略优先量词可以作为普通的匹配优先量词来处理。...>.*): 结果必然失败。整行文本都会被 .* 匹配,后面的 : 就无法匹配任何字符。固化分组阻止最后的 : 匹配必须进行的回溯,所以匹配必定失败。 8.
注释 在 Python 中,# 表示注释,作用于整行。 ''' ''' 或者 """ """ 表示区间注释,在三引号之间的所有内容被注释(多行注释)。 2. 运算符 1....if 语句 if 语句的 expr_true_suite 代码块只有当条件表达式 expression 结果为真时才执行,否则将继续执行紧跟在该代码块后面的语句,如果为假则不输出。...if - else语句就是对if 后的内容进行一个判断,是则将继续执行紧跟在该代码块后面的语句,否则执行else后的语句 temp = input("猜一猜小哥哥帅不帅?")...if - elif - else 语句对if后的内容进行一个判断,是则将继续执行紧跟在该代码块后面的语句,否则继续对elif后的内容进行一个判断,是则将继续执行紧跟在该代码块后面的语句,否则直到执行else...可疑语法的警告 ImportWarning 用于在导入模块过程中触发的警告 UnicodeWarning 与Unicode相关的警告 BytesWarning 与字节或字节码相关的警告 ResourceWarning
回溯 : 匹配字元失败时,匹配位置回到之前位置+1的地方,然后继续匹配其他路径 结束 : 如果在某个位置发现完全匹配,那么匹配成功。否则执行回溯。如果回溯所有路径均没有匹配成功,那么就返回匹配失败。...可以看到,这个正则存在两个连续的贪婪量词,并且可以分组重复。假设待匹配文本的长度量级为n。那么连续的贪婪量词可以在和为n之内进行任意组合,并且每一个组合可能还有n次分组重复的可能。...当然我相信没有人会真的写出上面那个愚蠢的正则表达式。但是在某些复杂的场景中,贪婪量词的嵌套情况还是大大存在的,这里也许需要更多的思考。我们就不得不提到一个法宝。...=(.+.+))\1+X/; evilReg.test(innocentString); ? 腰不酸了,腿不疼了,一口气上五楼,不费劲儿~~~~ ?...减少编译过程。
G的虚基类表指针之间的偏移量,在此可见为8。...从上面这些图可以直观地看到,在G对象中,内嵌的C基类对象的数据紧跟在G的数据之后,在H对象中,内嵌的C基类对象的数据也紧跟在H的数据之后。但是,在I对象中,内存布局就并非如此了。...这些指针成员变量指向派生类的虚基类,每个虚基类一个指针。这种方式的优点是:获取虚基类地址时,所用代码比较少。然而,编译器优化代码时通常都可以采取措施避免重复计算虚基类地址。...同样,在I实例中的G对象实例也有 “虚基类表指针”,不过该指针指向一个适用于“G处于I之中” 的虚基类表,表中一项为IdGvbptrC,值为20。...,结构中包含偏移量;后一句表示调用第i个虚函数时,this指针使用保存在虚函数表中第i项的偏移量来进行调整。
这个设置也可以在正则表达式中通过 \m \M 开关临时切换。 \m 后面的正则表达式会按照 magic 处理,\M 后面的正则表达式按照 nomagic 处理, 而忽略实际的magic设置。...本文下面使用的元字符都是 magic 模式下的。 量词 vim的量词与perl相比一点也不逊色。 vim Perl 意义 * * 0个或多个(匹配优先) \+ + 1个或多个(匹配优先) \?...0个或多个(忽略优先) \{-1,} +? 1个或多个(忽略优先) \{-,1} ?? 0个或1个(忽略优先) 从上表中可见,vim的忽略优先量词不像perl的 *? +? ??...懒惰模式 \{-n,m} 与\{n,m}一样,尽可能少次数地重复 \{-} 匹配它前面的项一次或0次, 尽可能地少 \| "或"操作符 \& 并列 函数式 :s/替换字符串/\=函数式...将各行的 id 字符串替换为行号 :%s/\(^\\)/\=(line(".")-10) .".". submatch(1) 将每行开头的单词替换为(行号-10).单词的格式,如第11
领取专属 10元无门槛券
手把手带您无忧上云