为什么以下RegEx仅在删除^和$?
时有效^(?<=.).+(?=.)$
来源:#Hello World#
目标:Hello World
期待找到解决方案。
非常感谢提前。
答案 0 :(得分:4)
这些外观无法与锚点结合使用。
^
断言字符串的开头(但不会提升引擎的位置&#34;光标&#34;)。然后(?<=.)
断言该位置还有任何字符。这在所有情况下都是矛盾的(差不多,见下一段)。 (?=.)
和$
也是如此。
在多行模式(m
)中,^
和$
可以匹配字符串中的其他点,特别是在每行的开头和结尾。在这种情况下,在这些位置之前或之后会有其他字符(换行符)。但是换行符不能与.
(在大多数引擎中)匹配,除非你也使用单行或&#34; dotall&#34;模式(s
)。因此,正则表达式可以匹配的唯一情况是同时使用m
和s
。
你可能正在寻找的是:
(?<=^.).+(?=.$)
其中断言有另一个字符,但只有一个字符(立即被字符串的末尾包围)。
我还应该清楚明白为什么(?=.)$
和(?=.$)
之间存在差异。 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之前没有任何字符,只是字符串的开头
最后一部分:(?=.)$
同样的问题,在前瞻之后你没有任何字符,因此它失败了。