首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

PHP.步步营 | 正则表达式详析 与 诸多运用实例

作为量词,表示 0 次或 1 次匹配。  位于量词后面用于改变量词贪婪特性。...(查阅量词) * 量词,0 次或多次匹配 + 量词1 次或多次匹配 {自定义量词开始标记 }自定义量词结束标记 \s匹配任意空白符,包括空格,制表符,换行符 [^\s]代表非空白符...* 量词,0 次或多次匹配 + 量词1 次或多次匹配 正则表达式每个元字符匹配一个字符, 当使用 + 之后将会变贪婪, 它将匹配尽可能多字符, 但使用问号 ?..., $match); echo $match[0]; //结果:010-12345678 懒惰模式:在匹配与可不匹配时候,优先匹配 $p = '/\d?...表示匹配任意数量重复,但是在能使整个匹配成功前提下使用最少重复。 也就是说, .

1.7K10

PHP正则表达式,看这一篇就够啦!

_],相当于[^\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则返回匹配数目。

64020
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    正则表达式学习笔记

    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会把全部内容匹配完。

    1.2K120

    python进阶(20) 正则表达式超详细使用

    大多数计算机语言正则表达式量词默认是贪婪,要想使用懒惰量词量词后面加?...match列表对象,如果匹配失败则返回None finditer():在输入字符串查找所有匹配内容,如果匹配成功,则返回容纳match迭代对象,通过迭代对象每次可以返回一个match对象,如果匹配失败则返回...代码②行finditer()函数返回迭代对象。...代码①行split()函数参数maxsplit和flags是默认,分割次数没有限制,分割结果是['AB', 'CD', 'EF']列表 代码②行split()函数指定maxsplit1,分割结果是...代码①行sub()函数参数count和flags都是默认,替换最大数量没有限制,替换结果是AB CD EF 代码②行sub()函数指定count1,替换结果是AB CD34EF 代码

    3.5K30

    学习正则表达式 - 量词

    {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 结束字符串。

    16220

    正则表达式量词

    之后,引擎继续读取文本字符T和正则表达式第一个字符块<,匹配失败,引擎读取文本下一个字符h,还是失败,直到读取到15个字符<,匹配成功。...然后引擎读取正则表达式[ou]字符块和文本/字符块,匹配失败,引擎重新从文本15个<之后开始读取字符,从正则表达式开头读取字符块……直到引擎读到了终结符,查找结束,找到了一个字符串,开始于文本...1位,结束于文本4位。...但是计算机并不能,他只能一个一个可能性地试过去,他可能从重复次数0开始尝试,0次不行就1次,1次不行就两次……,也有可能从最大重复次数开始试,最大不行就最大减一次……。...四、占有型量词 在贪婪型量词后面加一个+就成了占有型量词,占有型量词让被修饰字符重复最大次数。乍一看和贪婪型量词没啥区别啊,其实少了三个字,尽可能。还是用上面的例子来说,此时正则表达式.

    9910

    第四章 正则表达式回溯法原理

    从上面的描述过程,可以看出,路走不通时,就会发生“回溯”。即,尝试匹配失败时,接下来一步通常就是回溯。 道理,我们是懂了。那么JS中正则表达式会产生回溯地方都有哪些呢?...此时我们不禁会问,如果当多个贪婪量词挨着存在,并相互有冲突时,此时会是怎样? 答案是,先下手强!因为深度优先搜索。...3.2 惰性量词 惰性量词就是在贪婪量词后面加个问号。表示尽可能少匹配,比如: var string = "12345";var regex = /(\d{1,3}?)...只匹配到一个字符"1",而后面的 \d{1,3}匹配了"234"。 虽然惰性量词贪,但也会有回溯现象。比如正则是: ? 目标字符串是"12345",匹配过程是: ?...贪婪量词“试”策略是:买衣服砍价。价钱太高了,便宜点,不行,再便宜点。 惰性量词“试”策略是:卖东西加价。给少了,再多给点行,还有点少啊,再给点。 分支结构“试”策略是:货比三家。

    1K60

    PHP利用PCRE回溯次数限制绕过某些安全限制

    但此时显然是不对,因为正则显示.*后面还应该有一个字符 [(`;?>]。...所以 NFA 就开始回溯,先吐出一个 a,输入变成 5 步显示 //aaaa,但仍然匹配不上正则,继续吐出 a,变成 //aaa,仍然匹配不上…… 最终直到吐出;,输入变成 12 步显示 <?...这里有个有趣事情,就是 PHP 文档,中英文版本数值是不一样: ? 我们应该以英文版参考。 可见,回溯次数上限默认是 100 万。...那么,假设我们回溯次数超过了 100 万,会出现什么现象呢?比如: ? 可见,preg_match 返回1 和 0,而是 false。...其实如果我们仔细观察 PHP 文档,是可以看到 preg_match 函数下面的警告: ? 如果用 preg_match 对字符串进行匹配,一定要使用===全等号来判断返回值,如: <?

    1.7K10

    JS正则表达式--从入门到精分

    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过程

    1.5K20

    PHP正则表达式模式修正符

    [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兼容额外功能。模式任何反斜线后面跟上一个没有特殊意义字母导致一个错误,从而保留此组合以备将来扩充。

    1.5K20

    java正则表达式http_Java 正则表达式(精华)

    输出换行和缩进是为了可读而增加。 注意1个字符串中所有出现 John 后跟一个单词 地方,都被替换为 Joe Blocks 。2个字符串,只有第一个出现被替换。...注意其中行首和行尾标志,表示不能有任何文本在文本前面后后面,只能是行首和行尾。 完整匹配边界列表,在本文最后列出。 量词匹配 量词可以匹配一个表达式多次出现。...A* 量词 * 表示0次或多次。+ 表示1次或多次。? 表示0次或1次。还有些其他量词,参见本文后面的列表。 量词匹配分为 饥饿模式,贪婪模式,独占模式。饥饿模式 匹配尽可能少文本。...跟在后面,表示 * 采用饥饿模式。 饥饿模式下,量词只会匹配尽可能少字符,即0个字符。上例表达式将会匹配单词John,在输入文本中出现3次。...*+hurt *后跟+ 表示独占模式量词。 这个表达式在输入文本没有匹配,尽管文本包括 John 和 hurt. 为什么会这样? 因为 .*+ 是独占模式。

    1.4K10

    Java正则表达式详解

    输出换行和缩进是为了可读而增加。 注意1个字符串中所有出现 John 后跟一个单词 地方,都被替换为 Joe Blocks 。2个字符串,只有第一个出现被替换。...注意其中行首和行尾标志,表示不能有任何文本在文本前面后后面,只能是行首和行尾。 完整匹配边界列表,在本文最后列出。 量词匹配 量词可以匹配一个表达式多次出现。...A* 量词 * 表示0次或多次。+ 表示1次或多次。? 表示0次或1次。还有些其他量词,参见本文后面的列表。 量词匹配分为 饥饿模式,贪婪模式,独占模式。饥饿模式 匹配尽可能少文本。...跟在 后面,表示 * 采用饥饿模式。 饥饿模式下,量词只会匹配尽可能少字符,即0个字符。上例表达式将会匹配单词John,在输入文本中出现3次。...*+hurt *后跟+ 表示独占模式量词。 这个表达式在输入文本没有匹配,尽管文本包括 John 和 hurt. 为什么会这样? 因为 .*+ 是独占模式。

    2.5K00

    (转)java正则表达式(二)

    语句 boolean b = Pattern.matches("a*b", "aaaaab");等效于上面的三个语句,尽管对于重复匹配而言它效率不高,因为它不允许重用已编译模式。...Back 引用 是说在后面的表达式我们可以使用组编号来引用前面的表达式所捕获到文本序列(是文本不是正则)。....* \1 其中使用了分组,\1就是对引号这个分组引用,它匹配包含在两个引号或者两个单引号所有字符串,如,"abc" 或 " ' " 或 ' " ' ,但是请注意,它并不会对" a'或者 '...仅当子表达式 X 在 此位置左侧匹配时才继续匹配。例如,(?<=19)99 与跟在 19 后面的 99 实例匹配。此构造不会回溯。 (?<!X) 零宽度负后发断言。...仅当子表达式 X 不在此位置左侧匹配时才继续匹配。例如,(?<!19)99 与不跟在 19 后面的 99 实例匹配 说明: 非捕获组四个表达式区别: (?=X ) 和(?!

    71920

    精通正则表达式 - 打造高效正则表达式

    两个反斜杠导致了两次分支回溯,最后双引号引起了两次回溯,第一次是因为与分支 [^\\"] 匹配导致分支回溯,第二次是星号无法匹配引起量词回溯。此时所有的多选分支都匹配失败,整个多选结构无法匹配。...如果每次都会不同,那么正则表达式每次都需要编译,完全不能重复利用。折中优化措施就是检查插值后结果(也就是正则表达式具体值),只有当具体值发生变化时才重新编译。...(3)程序式处理编译缓存         在集成式处理,正则表达式使用与其在程序中所处位置相关,所以再次执行这段代码时,编译正则表达式就能够缓存和重复使用。...所以这种优化原理是,如果文字字符跟在忽略优先量词之后,只要引擎没有触及那个文字字符,忽略优先量词可以作为普通匹配优先量词来处理。...>.*): 结果必然失败。整行文本都会被 .* 匹配,后面的 : 就无法匹配任何字符。固化分组阻止最后 : 匹配必须进行回溯,所以匹配必定失败。 8.

    64670

    Python极简入门:数据类型、条件语句、循环语句、异常处理

    注释 在 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.7K10

    相爱相杀——正则与浏览器间爱恨情仇

    回溯 : 匹配字元失败时,匹配位置回到之前位置+1地方,然后继续匹配其他路径 结束 : 如果在某个位置发现完全匹配,那么匹配成功。否则执行回溯。如果回溯所有路径均没有匹配成功,那么就返回匹配失败。...可以看到,这个正则存在两个连续贪婪量词,并且可以分组重复。假设待匹配文本长度量级n。那么连续贪婪量词可以在和n之内进行任意组合,并且每一个组合可能还有n次分组重复可能。...当然我相信没有人会真的写出上面那个愚蠢正则表达式。但是在某些复杂场景,贪婪量词嵌套情况还是大大存在,这里也许需要更多思考。我们就不得不提到一个法宝。...=(.+.+))\1+X/; evilReg.test(innocentString); ? 腰不酸了,腿疼了,一口气上五楼,不费劲儿~~~~ ?...减少编译过程。

    50820

    C++:29 --- C++继承关系下内存布局(下)

    G虚基类表指针之间偏移量,在此可见8。...从上面这些图可以直观地看到,在G对象,内嵌C基类对象数据紧跟在G数据之后,在H对象,内嵌C基类对象数据也紧跟在H数据之后。但是,在I对象,内存布局就并非如此了。...这些指针成员变量指向派生类虚基类,每个虚基类一个指针。这种方式优点是:获取虚基类地址时,所用代码比较少。然而,编译器优化代码时通常都可以采取措施避免重复计算虚基类地址。...同样,在I实例G对象实例也有 “虚基类表指针”,不过该指针指向一个适用于“G处于I之中” 虚基类表,表中一IdGvbptrC,值20。...,结构包含偏移量;后一句表示调用i个虚函数时,this指针使用保存在虚函数表i偏移量来进行调整。

    1.2K20

    vim 正则表达式

    这个设置也可以在正则表达式通过 \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

    1.4K30
    领券