当前位置: 首页 > 知识库问答 >
问题:

由于消极前瞻的位置而导致的比赛差异?

方承弼
2023-03-14

我对正则表达式有很多困惑,我正在努力解决它们。这里有以下字符串:

{start}do or die{end}extended string

我的两个不同正则表达式,其中我只更改了点的位置:

(.(?!{end}))* //returns: {start}do or di
                                      //^ See here
((?!{end}).)* //returns: {start}do or die
                                      //^ See here

为什么第一个正则表达式吃最后一个“e”?

这个否定的前瞻性是如何使这个量词不贪婪的?我的意思是为什么它不能使用{end}之外的字符?

共有2个答案

宋鸿德
2023-03-14
匿名用户

我已经为两个正则表达式在完成任务时的正则表达式引擎计算了一个工作流程。。。

首先,对于(.(?!{end}))*正则表达式引擎的方法如下。。。

"{start}do or die{end}extended string"
^   .(dot) matches "{" and {end} tries to match here but fails.So "{" included
"{start}do or die{end}extended string"
 ^  . (dot) matches "s" and {end} tries to match here but fails.So "s" included

....
....so on...
"{start}do or die{end}extended string"
               ^ (dot) matches "e" and {end} here matches "{end}" so "e" is excluded..
so the match we get is "{start}do or di"

对于secodn正则表达式 ((?!{ end})。)*......

"{start}do or die{end}extended string"
^ {end} regex tries to match here but fails to match.So dot consumes "{".

"{start}do or die{end}extended string"
 ^ {end} regex tries to match here but fails again.So dot consumes "s".

....
..so on..
"{start}do or die{end}extended string"
               ^   {end} regex tries to match here but fails.So dot consumes the "e"
"{start}do or die{end}extended string"
                ^   {end} regex tries to match here and succeed.So the whole regex fail here.

So we ended up with a match which is "{start}do or die"

石博艺
2023-03-14

用你的消极展望,你说不可能匹配正则表达式,在你的例子中是:{end}。和<代码> 捕获除新行之外的所有内容。

第一个正则表达式:

(.(?!{end}))*

它省略了e,因为:由于负前瞻性,e{end}无法匹配。在第二个正则表达式中,在另一边有点,它可以一直到:{end}d,所以e包含在第二个正则表达式中。

 类似资料:
  • 首先,regex需要同时适用于python和PCRE(PHP)。我试图忽略正则表达式模式后面是否有字母“x”,以区分维度和下面给定示例中的字符串(如“number/number”): 从这里,我试图提取,但不是因为该部分实际上是维度的一部分。到目前为止,我想出了这个正则表达式 它可以提取我不希望它提取的内容,它看起来像这样。如果我将正面展望更改为负面,它会捕获除 中的最后一个“3”之外的两个。它看

  • 问题内容: 我有一个经典的Java EE系统,具有JSF的Web层,用于BL的EJB 3和用于对DB2数据库进行数据访问的Hibernate 3。我在以下情况下苦苦挣扎:用户将启动一个过程,该过程涉及从数据库中检索大型数据集。检索过程花费一些时间,因此用户不会立即收到响应,变得不耐烦,并打开新的浏览器并再次启动检索,有时是多次。EJB容器显然没有意识到第一次检索不再相关的事实,并且当数据库返回结果

  • 问题内容: 我有两个加载同一个类的ClassLoader。因此,显然这些不能互相投射。但是我需要访问在其他ClassLoader中创建的对象。 我可以访问两个ClassLoader。如何在其他课程中使用该对象?我不需要强制转换对象以匹配当前的ClassLoader。 但是问题在于返回的对象的类型为。因此,我必须放弃该对象才能访问某些方法。我怎样才能做到这一点?像下面这样的普通类型转换会导致Clas

  • 问题内容: 我的程序规格如下。1.所有四个数字都不同。2.千位数字是十位数的三倍。3.数字是奇数。4.数字的总和是27。我遗漏了整个程序的一些代码。它具有干净的编译器,但运行时会自动终止。我认为问题出在数据类型的转换中。 问题答案: 仅此一项就确保了while循环将永远不会进入,因为它是false。while循环中的任何内容都没有任何区别,因为它将永远不会执行。 你可能想写 除了此错误外,您的情况

  • 类似于这里的问题。我的测试不稳定。尝试并捕获解决方案在这里不起作用。有解决这个问题的最佳实践吗?

  • 问题内容: 在此 coderanch链接上,我发现以下注释将给编译器错误:- 原因是,Unicode序列直接由其对应的实际字符替换。由于’\ u000a’对应于newLine字符,因此将newLine放置在找到’\ u000a’的位置。 我的问题是,“由于注释,还有其他方式导致编译错误吗?” 问题答案: 如果在注释()中定义了不推荐使用的函数,并且设置了使用不推荐使用的方法时编译器抛出错误(至少可