正面观察遇到麻烦

时间:2013-06-15 18:28:11

标签: regex autoit

为什么以下RegEx仅在删除^和$?

时有效
^(?<=.).+(?=.)$

来源:#Hello World#
目标:Hello World

期待找到解决方案。
非常感谢提前。

3 个答案:

答案 0 :(得分:4)

这些外观无法与锚点结合使用。

^断言字符串的开头(但不会提升引擎的位置&#34;光标&#34;)。然后(?<=.)断言该位置还有任何字符。这在所有情况下都是矛盾的(差不多,见下一段)。 (?=.)$也是如此。

在多行模式(m)中,^$可以匹配字符串中的其他点,特别是在每行的开头和结尾。在这种情况下,在这些位置之前或之后会有其他字符(换行符)。但是换行符不能与.(在大多数引擎中)匹配,除非你也使用单行或&#34; dotall&#34;模式(s)。因此,正则表达式可以匹配的唯一情况是同时使用ms

你可能正在寻找的是:

(?<=^.).+(?=.$)

其中断言有另一个字符,但只有一个字符(立即被字符串的末尾包围)。

我还应该清楚明白为什么(?=.)$(?=.$)之间存在差异。 Lookarounds 不会提升引擎&#34;光标&#34; 的位置。这意味着,在(?=.)$的情况下,引擎检查当前位置是否紧跟另一个角色 - 并且一个满足且前瞻留下,引擎仍处于相同位置(&#39} ;为什么它被称为前瞻。因此,您需要将锚点放入外观中,以便在重置&#34;光标&#34;的位置之前实际检查它们。

More information on lookaround.(该页边栏还有第二部分)

答案 1 :(得分:1)

^(?<=.).+(?=.)$就像是匹配

字符串
  • 锚定在字符串的开头和结尾
  • 以匹配前的字符(不是匹配的一部分)开头
  • 在比赛结束后跟随一个角色(不是比赛的一部分)

这是矛盾的。如果你想在一开始就锚定一个字符串,那么它之前(左边)就不会有任何字符;反之亦然,最后是锚。

答案 2 :(得分:0)

你的正则表达式没有意义:

^   means the begining of the string
$   means the end of the string

(?=....) means followed by (lookahead)
(?<=....) preceded by (lookbehind)

第一部分:^(?<=.)失败,因为你在lookbehind之前没有任何字符,只是字符串的开头

最后一部分:(?=.)$同样的问题,在前瞻之后你没有任何字符,因此它失败了。