Advertisement

距离弄懂正则的环视,你只差这一篇文章

阅读量:

正则表达式的环视是什么

环视意为 环绕一圈查看周围情况 ,通常通过左右张望来确定最佳位置。在这一过程中,
对应的是一个个体位置而非单个字符 ,这一点至关重要。

那么我们是如何确定这个合适位置的呢?显然就是按照环绕区域所包含的条件去寻找这个位置。接下来我会结合生活中的具体场景来详细阐述每一种环视的情况。

肯定的顺序环视

假如你是一名叫张三的学生,在体育课时需要同学们排成一队进行训练。由于记性不太好,你忘记了自己原本的位置;但幸运的是你还记得自己后面是李四同学。因此,在这种情况下你可以先找到李四的位置,在他的前面站定

我们可以通过regular expression来denote这个位置的出现。具体来说,在这种情况下, 那么这个正则表达式的构造就是 (?=李四) ,它实际上标识了你要寻找的位置.

让我们先来理解以下 顺序环视 和 逆序环视 这两个概念吧。通常情况下,在处理正则表达式时遵循从左向右的方向性。当我们在进行模式匹配时,默认会依次向右推进每一个字符的位置进行检查。在这种背景下讨论的位置关系中:当我们需要评估某位置右侧是否满足特定条件时,则称之为顺序环视;而对于左侧的情况,则属于逆序环视范畴。

在操作中,请注意:所有环视符号都以 (? 开头,在接下来的一到两个字符中标识特定的环视类型;之后的部分将描述需要满足的条件,并以一个 ) 符号表示结束。其中,“(?=条件)”这部分可以理解为:问号表示疑问,“=` 则表示是否满足当前匹配位置的条件匹配。也就是说,在当前位置是否满足给出的条件要求?

我们来实践一下吧,假如b表示李四,你能否找出张三需要站的位置呢?

否定的顺序环视

假设你是一名叫张三的学生,在体育课时需要我们排成一队。然而, 你不愿意让李四站在你的身后, 因为你知道, 李四总是喜欢用中性笔在你的后背上随意涂鸦, 并且带有愉悦的表情符号:joy:。那么, 你会如何选择位置呢?这时候你会如何选择位置? 你会发现, 只要考察每一个可用的位置, 并且确保该位置的身后没有李四即可。因为即使李四位于你前面也没关系, 因为他无法对你背后产生影响。

在做出这个选择时所依据的逻辑基础是:仅当不为李四占据该位置时才可能实现目标。为了直观呈现这一选择条件关系, 我们可以参考以下图形进行说明。

上面这个位置可以用正则表达式 (?!\text{李四}) 用于表示。对于程序开发人员来说,我们对 ! 非常熟悉,在此处同样地表示着这一含义。该符号无法满足后续的条件要求。

我们来实践一下吧,假如b表示李四,你能否找出张三需要站的位置。

肯定的逆序环视

作为一名叫张三的学生,在体育课上同学们需要排队列队。由于记忆不太好导致暂时无法回想自己的初始位置。不过幸运的是他记得自己前面站着的是李四。因此这个时候你需要先找到站在自己前面的同学李四然后再站在他的后面就可以完成排队的任务。这样做的背后逻辑在于确保你的起始位置能够被正确识别从而保证整个队伍的顺利排列过程

我们可以用下面这个图来表示你的选择。

当我们采用正则表达式来标识该位置时,则表示为 (?<=李四) ,这也就意味着你所寻找的位置。那么,在这种情况下,则是 (?<=条件) 也可以这样理解:也就是说当前位置左侧是否满足给定的条件?

我们来实践一下吧,假如b表示李四,你能否找出张三需要站的位置。

否定的逆序环视

假使你是名字叫张三的学生,在体育课上你需要排成一队。你是个调皮捣蛋的小孩,在班级里总是喜欢惹麻烦,在别人的后背上乱涂乱画(带有个开心的表情)。不过老师说你可以随便站着不动(但位置上绝对不可以),不可以让他(指李四)站到你的前面!

此时你需要如何做出选择?你可以先选定一个合适的位置。然后确保你的前面没有人叫李四即可。即使李四出现在你的后面位置上,你也无法在他背上传统汉字区域随意标注或修改。

因为你的这种选择背后的原因是,在我的这个位置上之前不可以放置李四才行。我们可以借助下述图形来直观展示这一选择。

当我们使用正则表达式来表示这个位置时,则是通过 (?<!李四) 来替代你的需求。 其中 (?<!条件) 实际上就是指疑问符号 < 加上小于符号 < 和非匹配指示符 ! 的组合。 问号代表的是疑问状态,小于符号指示当前位置的左侧方向,并且感叹号表明这种情况下无法满足给定的条件要求。

我们来实践一下吧,假如b表示李四,你能否找出张三需要站的位置。

当您到达此处时, 您应该已经了解了这几种环视的表现形式及其意义. 让我们深入探讨一下环视在实际开发过程中的应用.

环视在实际开发中的应用

数字千分位的处理

在实际开发中担任前端角色的人员通常会将原始数据美化以便于展示,并将其供展现以便于后续操作。对于数值型数据来说,在进行计算时需确保其表示形式正确。

这个问题的解决方案有很多种,在解决该问题时我们可以采用正则表达式这一方法并且这种方法是一个非常有效的选择而且这个正则表达式需要用到我们今天学习到的环视结构那么我们应该具体该怎么做才能利用好这个环视结构来解答问题呢

在应用正则表达式解决问题的过程中,在解决问题的第一步就是要明确需要解决的问题是什么。针对这个问题而言我们需要解决的是确定某些特定的位置具体定义是一个数字这些位置的具体定义是一个数字这些位置的具体定义是一个数字这些位置的具体定义是一个数字

当我们在解决某个具体问题时,在代码中编写一个正则表达式来实现特定功能是非常常见的需求。在这个案例中,在代码中编写一个能够每隔三位数字的位置进行匹配就显得尤为重要。这实际上非常直观——我们只需要设计一个能够匹配每隔三位数字的位置即可完成任务。在正向量 lookahead中使用 (?=\d{3}) 是一种很自然的选择,在编程实践中这一方法也经常被采用以达到预期效果。通过实际运行代码并查看匹配结果可以看出这一设计是有效的

满足上述条件的位置共有多个情况出现其中有些情况并非是我们所期望的目标位置例如在5与6之间的位置并不符合我们的预期目标然而在该位置之后出现的内容如 678 却同样符合我们的正则表达式筛选标准因此能够被匹配上那么如何筛选出我们需要的目标位置呢

还有一个隐藏的条件需要满足的就是我们必须要 匹配字符串末尾的位置 。如果我们对之前的正则表达式进行调整,并将其修改为 (?=\d{3}$) ,那么我们就指定了一个新的 匹配位置 ,即该位置之后紧跟着的是三个数字,并且正好是字符串的末尾。让我们验证一下这一修改后的效果如何。

当我们设定为最开始匹配的位置后, 现在我们已经确定了一个正确的位置. 但目前这并未满足我们的需求, 我们还需要识别出位于3与4之间的位置. 在这种情况下, 我们可以借助量词来解决问题. 经过计算, 我们意识到,在字符串末尾前有6位数字, 而这个数目正好是3的倍数. 因此我们需要能够识别出由3个、6个、9个等数量组成的数字序列. 因此我们可以将原来的表达式修改为 (?=(\d{3})+$) , 其中 + 作用于前面括号内包含的 \d{3} 表示至少需要出现一次这样的数字序列.

在本次匹配中发现了一个潜在的问题,在数字字段被错误地识别为其他类型的情况下,并不符合我们的预期结果。为此我们需要一种新的解决方案来解决这个问题。部分学生可能会提出这样的建议:即通过确保每个字段左侧都有一个数字来进行验证操作。基于这一思路我们可以构建如下的正则表达式:(?<=\d)(?=(\d{3})+$) 这里的逆序环视操作是为了保证当前位置左侧存在一个确定的数值标记

这次该正则表达式最终达成了预期目标,在精准匹配到了正确的数据位置上发挥了关键作用。如果你认为之前提到的正则表达式略显冗长,则可以选择性地进行优化操作——我们可以用替代 \B 代替 (?<=\d) 的位置来判断数字前后字符的情况。同样的结果也能达成——你明白其中的道理吗?欢迎在评论区与大家分享你的看法和见解。

对正则表达式的 全局模式识别 已经完成,请您在此处提出您的疑问与建议。期待您的关注与交流!让我们共同探索更多实用的正则知识吧!

全部评论 (0)

还没有任何评论哟~