在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
效果?regex
Python。在大多数情况下,您可以使用来避免变长后视\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..)只是包含字母的字符串。