当前位置: 首页 > 面试题库 >

正则表达式的变长后置断言替代

白高逸
2023-03-14
问题内容

在Python / PHP / JavaScript中是否存在支持可变长度lookbehind-assertion的正则表达式实现?

/(?<!foo.*)bar/

如何编写具有相同含义但不使用lookbehind-assertion的正则表达式?

是否有可能在一天之内实现这种断言?

我认为情况要好得多。

更新:

(1)已经有一些正则表达式实现支持变长后向断言。

Python模块正则表达式(不是standardre,而是其他regex模块)支持此类断言(并具有许多其他很酷的功能)。

>>> import regex
>>> m = regex.search('(?<!foo.*)bar', 'f00bar')
>>> print m.group()
bar
>>> m = regex.search('(?<!foo.*)bar', 'foobar')
>>> print m
None

对于我来说,令Perl和Python不能使用的正则表达式感到非常惊讶。也许,Perl也有“增强的正则表达式”实现吗?

(感谢MRAB +1)。

(2)\K现代正则表达式有一个很酷的功能。

这个符号意味着当您进行替换时(从我的观点来看,断言最有趣的用例是替换),之前找到的所有字符都\K不得更改。

s/unchanged-part\Kchanged-part/new-part/x

那几乎就像是一个后置断言,但是当然不是那么灵活。

更多关于\K

据我了解,您不能在同一正则表达式中两次使用\K。而且,直到说到要“杀死”您发现的角色,您都无法说出。那总是一直到行的开始。

(感谢ikegami +1)。

我的其他问题:

  • 能否说出最后一点必须是\K效果?
  • Perl / Ruby / JavaScript / PHP的增强型正则表达式实现如何?类似于regexPython。

问题答案:

在大多数情况下,您可以使用来避免变长后视\K

s/(?<=foo.*)bar/moo/s;

将会

s/foo.*\Kbar/moo/s;

负向后看有点棘手。

s/(?<!foo.*)bar/moo/s;

将会

s/^(?:(?!foo).)*\Kbar/moo/s;

因为(?:(?!STRING).)*STRING[^CHAR]*CHAR

如果您只是匹配,则可能甚至不需要\K

/foo.*bar/s

/^(?:(?!foo).)*bar/s


 类似资料:
  • 本文向大家介绍正则表达式零宽断言详解,包括了正则表达式零宽断言详解的使用技巧和注意事项,需要的朋友参考一下 正则表达式零宽断言: 零宽断言是正则表达式中的难点,所以本章节重点从匹配原理方面进行一下分析。零宽断言还有其他的名称,例如"环视"或者"预搜索"等等,不过这些都不是我们关注的重点。 一.基本概念: 零宽断言正如它的名字一样,是一种零宽度的匹配,它匹配到的内容不会保存到匹配结果中去,最终匹配结

  • 问题内容: 我正在尝试以的形式找到网页上的所有链接,或者我做了一个正则表达式,并且可以正常工作: 但是,有没有更短的写方法呢?我重复了:// [^ / \“] + /两次,可能没有必要。我尝试了各种方法,但是没有用。我尝试了: 很明显,我在这里缺少了一些东西,或者我只是对Python正则表达式不够了解。 问题答案: 您正在使用捕获组,并在使用捕获组时改变其行为(它只会返回捕获组的内容)。您的正则表

  • 我试图在json响应体中使用RestAssured作为集成测试的一部分来断言时间戳字段。我不确定哪种方法是执行正则表达式匹配的正确方法 以下是json响应: 这是我的重新保证响应断言的代码 当我编译上面的代码时,我在验证时间戳模式时遇到了错误 我不确定哪种方法将在hamcrest支持正则表达式模式检查。

  • 本文向大家介绍javascript 正则表达式分组、断言详解,包括了javascript 正则表达式分组、断言详解的使用技巧和注意事项,需要的朋友参考一下  javascript 正则表达式分组、断言详解   提示:阅读本文需要有一定的正则表达式基础。        正则表达式中的断言,作为高级应用出现,倒不是因为它有多难,而是概念比较抽象,不容易理解而已,今天就让小菜通俗的讲解一下。      

  • 问题内容: 我有这个字符串: 现在,我想在每个数字之前添加String num:。 因此结果必须是: 这也必须工作: 用于搜索数字的正则表达式是:[0-9]+ 但是我想用num:+ [匹配的子字符串]替换匹配的子字符串。 我现在写了一个带有数字的示例,但另一个示例可以是:在每个电子邮件地址之前添加 ·Email found·: 问题答案: 利用分组。您可以使用括号(并)定义组,并通过组索引$n在哪

  • 在这个问题的背景下,我想做以下修改: 查找: funcA(参数0,参数1,参数2,参数3); 替换: funcA可以有除param0之外的任意数量的参数。怎么做呢?为简单起见,忽略基本情况,即当传递给funcA的参数仅为param0时。 funcA是: 职能是: 编辑: 参数(param1,param2..)只是包含字母的字符串。