当前位置: 首页 > news >正文

广西做网站建设的公司网站建设验收使用情况

广西做网站建设的公司,网站建设验收使用情况,宝安营销型网站制作,wordpress 页面 自定义在日常的开发工作当中#xff0c;我们必不可免的会碰到需要使用正则的情况。 正则在很多时候通过不同的组合方式最后都可以达到既定的目标结果。比如我们有一个需要匹配的字符串#xff1a; hello#xff0c;我们可以通过 / ./p/ 以及 / .?/p/ 来匹配我们必不可免的会碰到需要使用正则的情况。 正则在很多时候通过不同的组合方式最后都可以达到既定的目标结果。比如我们有一个需要匹配的字符串 hello我们可以通过 / ./p/ 以及 / .?/p/ 来匹配两种方式就像就像中文语法中的陈述句以及倒装句不同的语序往往不影响我们的理解但是他们的运作方式却完全不一样。 为了让大家有一个更加直观的感受这里将 hello 分三次存到一份百万字符文档的最前面中间以及最后面然后分别使用上面的 2 个正则表达式进行匹配并测算匹配到对应字符所需要的时间结果如下实验结果通过 https://regexr.com/ 得出 最前面 中间 最后面 / ./p/ 1.1ms 0.7ms 0.2ms / .?/p/ 0.1ms 0.2ms 0.3ms 由此我们可以明显地看出不同的撰写方式匹配的效率也有很大的不同。 撰写正则是一个不断思考与抉择的过程。就像一道数学题中往往包含一种或几种最优解的可能想要趋近这个结果就需要我们理清题意掌握正则的表达方式以及加强对正则运作方式的理解。 那么我们应该如何趋近最优解养成良好的撰写习惯锻炼撰写健壮的正则表达式的能力呢 知己知彼百战不殆要写好正则表达式就需要做到知其然还要知其所以然。因此本文将尝试从正则原理的角度出发介绍正则匹配的规则梳理正则与有限自动机的关系、及有限自动机之间的转化逻辑并解释回溯等相关概念。希望能够帮助大家更好地理解及使用正则。 正则表达式与有限自动机FA 正则表达式是建立在 有限自动机 ( Finite Automaton ) 的理论基础上的是自动机理论的应用。当我们写完相关的表达式之后正则引擎会按照我们所写的表达式构建相应的自动机若该自动机接受输入的文本并抵达最终状态则表示输入的文本可以被我们所写的正则表达式匹配到。 有限自动机的图示 自动机的图形化包含以下元素 箭头表示路径可以在上面标注字母表示状态 1 经过该字母可以转换到状态 2 也可以是标注 ε即空串表示无需经过转换就可以从状态 1 过渡到状态 2 单圆圈表示非结束的中间状态 双圆圈表示结束状态 由自身指向自身的箭头用于表示 Kleene 闭包也就是正则表达式中的 指可以走任意次数的路径。 以 abc 这条正则表达式为例其有限自动机的图示如下表示状态 1 经过 a 可以过渡到状态 2 在状态 2 可以经过 ε 再循环经过 b 也可以不经过 b 而直接通过通过 ε 再经由 c 过渡到最终的结束状态。 不确定有限自动机NFA及确定有限自动机DFA 有限自动机又可以分为 NFA不确定有限自动机Nondeterministic Finite Automaton 及 DFA确定有限自动机Deterministic Finite Automaton NFA 的不确定性表现在其状态可以通过 ε 转换 以及对同一个字符可以有不同的路径。而 DFA 可以看作是一种特殊的 NFA其最大的特点就是确定性即输入一个字符一定会转换到确定的状态而不会有其他的可能。 以 ab|ac 这条正则表达式为例子我们可以得到以下 NFA 及 DFA 两种自动机。 可以看到自动机 1 中我们有两条路径都是 a经由 a 可以到达下一个状态而自动机 2 中只有一条路径对于图一来说经由相同的 a 路径却可以导致不同的结果这即是 NFA具有不确定性。而对图二来说其路径都是通往明确的结果具有确定唯一性所以是 DFA。 正则替换成 NFA 从上面的图中我们可以看出 DFA 的匹配路径比 NFA 要少且匹配的速度要更快但是目前大多数的语言中的正则引擎使用的却是 NFA为什么不直接使用 DFA 而要使用 NFA为了解答这个问题我们需要知道如何通过正则转化成 NFA而 NFA 又可以怎样转成 DFA。 正则表达式转 NFA 主要基于以下 3 条规则R 表示正则表达式 连接 R AB 选择 R A|B 重复 R A* 其他的运算基本都可以通过以上三种运算转换得到比如 A 可以用 AA* 来表示 Thompson 算法 为了更好地理解上面的 3 条转换规则这里介绍比较实用且容易理解由 C 语言 Unix 之父之一的 Ken Thompson 提出的 Thompson 算法。其思想主要就是通过简单的表达式组合成复杂的表达式。 Thompson算法 中两种最基本的单元或者说两种最基本的 NFA: 表示经过字符 a 过渡的下一个状态以及不需要任何字符输入的 ε 转换 过渡到下一个状态。 对于连接运算 R AB我们将 AB 拆解成 NFA(A) 与 NFA(B) 两个单元然后进行组合 对于选择运算 R AB我们同样将 A 与 B 拆解成 NFA(A) 与 NFA(B) 两个单元然后进行组合 对于重复运算 R A*其表示可能不需要经过转换可能经过 1 次或者多次所以拆解成单一 NFA 后我们可以这样表示 由此我们就可以根据上面的 3 条转换规则将正则表达式进行拆分重组最后得出相应的 NFA。 NFA 转换成 DFA 及其简化 DFA 实际上是一个特殊的 NFA转 DFA就是要将 NFA 中将所有等价的状态合并消除不确定性。 这里以《编译原理》一书中的一道例题来完整地讲解一下如何从正则转 NFA 再转成相应的 DFA并对其进行简化。 eg: (a|b)(aa|bb)(a|b) 这里我们依据正则转 NFA 的三条规则以及 Thompson 算法 的理念将上述的表达式进行拆分与组合 首先我们将该表达式以括号为分隔视为 3 个正则表达式子通过连接符连接以此拆分成 3 个表达式并将其组合 然后根据每个表达式括号内的内容继续拆分成更细的单元碰到运算符号则按照规则进行转换以此类推直到 NFA 变成变成由最小单元组合而成。 子集构造算法 正如前面所说NFA 转 DFA 本质是将等价的状态合并消除不确定性。要找出等价的状态我们需要先找出各个状态的集合。 上面的表达式只有 a 跟 b 两个字符所以我们要得出各个状态经过 a 以及经过 b 的所有集合然后再将等价的集合合并。这里先画出所有集合构成的转换表单结合图示将更有助于我们的的理解。 I Ia Ib {i,1,2} {1,2,3} {1,2,4} {1,2,3} {1,2,3,5,6,f} {1,2,4} {1,2,4} {1,2,3} {1,2,4,5,6,f} {1,2,3,5,6,f} {1,2,3,5,6,f} {1,2,4,6,f} {1,2,4,5,6,f} {1,2,3,6,f} {1,2,4,5,6,f} {1,2,4,6,f} {1,2,3,6,f} {1,2,4,5,6,f} {1,2,3,6,f} {1,2,3,5,6,f} {1,2,4,6,f} 图示第一列主要是放置所有不重复的集合第二列表示经过 a 的集合第三列表示经过 b 的集合 子集构造法 寻找集合的规则为碰到一个字符如果这个字符后面有可以通过 空串ε转换到达下一个状态则下一个状态包含在该集合中一直往后直到碰到一个明确的字符 从上面构造的NFA的初始状态 i 开始其经过 2 个 ε转换 转换可以到达 2 状态此后必须经过 a 或者 b由此我们可以得到第一个状态集合 {i,1,2} 从第一个集合开始分析集合内分别经过 a 和 b 可以达到什么状态可以看到初始集合中 i 只经过空串不经过 a、b 状态 1 经过 a 可以到达它自身也可以再经过 ε 到达状态 22 经过 a 只能到达状态 3 据此我们得到初始集合经过 a 的集合为 {1,2,3}同样的初始集合经过 b 只在状态 2 与经过 a 不同所以我们可以得到经过 b 的集合为 {1,2,4} 因为 {1,2,3}{1,2,4} 都没有出现过所以这里我们将其记到第一列的第二与第三行并分析它们经过 a 与 b 的集合。 以此类推直到获得上述所有集合构成的转换表单完整文字版推导过程附于文末附录 可以看到上面的转换表的第一列中一共有 7 个集合这里我们给第一列的集合进行排序为方便与 NFA 对比这里将序号 0 改为 i并对右边经过 a 跟经过 b 的所有集合根据左边的序号进行标记可以得到相应转换矩阵: I Ia Ib {i,1,2} i {1,2,3} 1 {1,2,4} 2 {1,2,3} 1 {1,2,3,5,6,f} 3 {1,2,4} 2 {1,2,4} 2 {1,2,3} 1 {1,2,4,5,6,f} 4 {1,2,3,5,6,f} 3 {1,2,3,5,6,f} 3 {1,2,4,6,f} 5 {1,2,4,5,6,f} 4 {1,2,3,6,f} 6 {1,2,4,5,6,f} 4 {1,2,4,6,f} 5 {1,2,3,6,f} 6 {1,2,4,5,6,f} 4 {1,2,3,6,f} 6 {1,2,3,5,6,f} 3 {1,2,4,6,f} 5 转换矩阵 S a b i 1 2 1 3 2 2 1 4 3 3 5 4 6 4 5 6 4 6 3 5 依据转换矩阵我们把第一列的数据作为每一个单独状态并以 i 为初始状态由矩阵可得其经过 a 可以到达状态 1经过 b 可以到达状态 2同时我们将包含 f 的集合作为终态即序号 3456以此类推我们可以得到如下的 NFA 因为该 NFA 不包含空串也没有由一个状态分出两条相同的分支路径所以该 NFA 就是上述表达式的 DFA。但该 DFA 看起来还比较复杂所以我们还需要对其进一步简化。 Hopcroft 算法化简 Hopcroft 算法 是1986年图灵奖获得者 John Hopcroft 所提出的其本质思想跟子集构造法相似都是对等价状态的合并。 Hopcroft 算法 首先将未化简的 DFA 划分成 终态集 和 非终态集因为这两种状态一定不等价之后不断进行划分直到不再发生变化。每轮划分对所有子集进行。对一个子集的划分中若每个输入符号都能把状态转换到等价的状态则两个状态等价。 这里依据 Hopcroft 算法 将上述 DFA 以终态以及非终态进行划分可以得到 {i,1,2} 以及 {3,4,5,6} 两个集合。然后分别分析两个集合是否能够进一步划分。 集合 {i,1,2} 经过 a 可以得到状态 1 和 33 不在集合 {i,1,2} 中依据矩阵图我们可以看到 i 和 2 经过 a 都到状态 11 经过 a 可以达到状态 3于是我们将 {i,1,2} 划分成 {i,2} 和 {1} 两个集合 因为 {1} 已经是最小集合所以无法继续划分所以分析 {i,2} 集合经过 b 的情况{i,2} 经过 b 可以达到状态 2 和 44 同样不在集合中所以需要对 {i,2} 进行划分依据矩阵表我们可以划分成 {i}{2}至此非终态已经无法往下拆分所以分析结束我们得到的拆分集合为 {i}{1}{2} 终态集合 {3,4,5,6} 经过 a 可以达到状态 3 和 63 和 6 都在集合内部所以无需往下拆分经过 b 可以达到状态 4 和 54 和 5 同样都在集合内无需拆分。所以我们可以将 {3,4,5,6} 当作是一个整体。 将集合 {3,4,5,6} 当作一个整体记成状态 3重新梳理上面的矩阵并将所有指向 3456 的路径都指向新的状态 3我们可以得到新的也是最简单的 DFA 从上面的转换过程可以看到实际上NFA 转 DFA 是一个繁琐的过程如果正则采用 DFA 引擎势必会消耗部分性能在 NFA 的转换上而这个转换的效益很多时候远不比直接用使用 NFA 高效同时 DFA 相对来说没有 NFA 直观可操作空间也要比 NFA 少所以大多数语言的采用 NFA 作为正则的引擎。 回溯 正则采用的是 NFA 引擎那么我们就必须面对它的不确定性体现在正则上就是 回溯 的发生。 遇到一个字符串NFA 拿着正则表达式去比对文本拿到一个字符就把它与字符串做比较如果匹配就记住并继续往下拿下一个字符如果后面拿到的字符与字符串不匹配则将之前记下的字符一个个往回退直到上一次出现岔路的地方。 假设现在有一个正则表达式 ab|ac需要匹配字符串 ac。则 NFA 会先拿到正则的字符 a然后去比较字符串 ac发现匹配中了 a则会去拿下一个字符 b然后再匹配字符串发现不匹配则回溯吐出字符 b回到字符 a取字符 c 去匹配字符串发现匹配完成比对。 文字或许比较枯燥这里用下面得图示来表示上述的过程蓝色圆圈表示NFA拿到正则的字符后去匹配字符串看是否可以过渡到下一个状态同时字符的颜色变化表示是否可以被匹配中 贪婪模式与惰性模式对比 回到一开始讲的通过 / ./p/ 以及 / .?/p/ 来匹配 hello 的问题因为量词的特殊性以及 回溯 的存在所以2种方式的匹配效率也不一样。 表示重复零次或多次一般情况下会以 贪婪模式 尽可能地匹配多次因此在上面的匹配过程中它会在匹配到 之后一口气把之后的字符也吞并掉然后通过回溯匹配 字符直到匹配到完整的 /p而当我们给 * 加上 ? 之后它就变成非贪婪的 惰性模式当匹配到 之后它就会通过回溯逐步去匹配 /p 直到匹配中完整的字符串。 目标字符串 hello 在两个表达式下的匹配过程 表达式/ ./p/ 表达式/ .?/p/ 匹配 匹配 表达式ab aaa 匹配 a aaa 匹配 b aa 回溯 aa 匹配 b a 回溯 a 匹配 b 回溯 这个正则表达式回溯到最后也没有匹配到对应的字符串而通常我们所写的正则并不单单像例子中只回溯这一小部分设想一下一个需要多处回溯的正则表达式子去匹配成百上千甚至上万个字符那对机器来说是多么可怕的一件事情。https://www.ixigua.com/7202959346417074688
http://www.hkea.cn/news/14306395/

相关文章:

  • 什么专业可以做网站大一python基础编程题
  • 网站建设企业云市场单机怎么做网站
  • 衡阳做网站建设的公司典型的网站开发人员
  • t型布局网站怎么做shopify建站流程
  • 厦门创意互动网站建设投资公司设立条件
  • 手机网站怎么建立工厂采购信息网
  • 上海沙龙网站建设网站定制的公司
  • 网站备案域名更改吗程序员做的导航网站
  • 西咸新区建设环保网站网址收录平台
  • 做电影网站服务器需求网站建设,h5,小程序
  • 深圳网站建设延安网站编辑框超链接怎么做
  • 白沟做网站广州市运营推广公司
  • 上海免费建网站手机网站后台管理
  • 免费做图素材网站织梦+和wordpress
  • 沙河口网站建设土特产 网站源码
  • 石景山网站建设好的公司搜索引擎优化的例子
  • 磁县网站建设小程序开发哪家公司好
  • 外包+网站开发公司中国建设银行网站会员可以改名
  • 姜堰网网站写作网站5秒不写就删除
  • 新开河街网站建设公司别墅外观设计网站推荐
  • 做苗木行业网站赚钱同一建筑施工企业在12个月内
  • 手机创建网站的软件非寻服饰网站建设规划书
  • 海西州电子商务网站建设公司公司就两个开发
  • 网站搭建平台有哪些网站设计工资一般多少
  • wordpress在线预览开鲁网站seo
  • asp网站用什么软件网站开发常用语言总结
  • 学做彩票网站有哪些宽带
  • 做石材外贸用什么网站大石桥城乡规划建设局网站
  • 洪梅镇仿做网站个人简历表下载可填写
  • ssh购物网站开发视频dedecms做的网站