对于模糊的标题感到抱歉,我必须做很多事情并且我避免使用REGEX(直接,我最终将其包装起来),我现在认为这种情况太常见而不能解决。
反斜杠逃脱!我正在用%%替换%%和结束%%之间的文本,但我希望能够编写%%。
我想说如果在%%之前有一些东西,那么请确保它不是\,例如:
[^\]%%
不会工作,因为它不会在字符串的开头处得到东西。
[^\]?%%
无法正常工作,因为如果是反斜杠,则可选。
我写这篇文章的时候只是想了一下!
/(?:(?:(?:\\\\{2})+)|[^\\\\])%%(.*)%%/
(注意\\
是正则表达式中的字母反斜杠。
将其读作"(非零偶数反斜杠或不反斜杠),然后是%% ...."
如果没有测试,您可以看到这不会起作用,因为给定\\\%%stuff%%
正则表达式引擎会看到\\%%stuff%%
(在第一个\
之后是一个偶数)
所以
/(?:(?:[^\\\\](?:\\\\{2})+)|[^\\\\])%%(.*)%%/
似乎是下一步,这就是
"((不是反斜杠)后跟偶数个反斜杠或不是反斜杠)后跟%% ..."
哪个更近了!我们现在有字符串的开头问题,我们也可能将正则表达式考虑在内:
/(?:[^\\\\](?:\\\\{2})*)%%(.*)%%/
这是"不是反斜杠后跟任何偶数个反斜杠后跟%% ...."这几乎是伟大的!
然后我发现了一些魔法,因为这是如此的关闭,正如我所说,我无法相信这还没有完成,请参阅答案。
答案 0 :(得分:0)
您可能知道,至少使用PERL正则表达式,^
表示字符串开头(在类中未找到),$
表示结束。这些很棒,因为它们意味着像^a
这样的规则匹配以a开头的字符串(有时是行),而不是它在任何地方找到的第一个字符串。
它突然袭击了我,在#34;字符串"开始时没有任何技术上的困难。作为基于它的输入和转换状态! (正则表达式被编译为"确定性有限自动机 - 状态机!)所以我认为我用^来测试它,所以现在它是"(不反斜杠后跟偶数个反斜杠或者字符串的开头)后跟%% ...."
/(?:(?:[^\\\\](?:\\\\{2})+)|[^\\\\]|^)%%(.*)%%/
可以写成(通过识别0反斜杠的情况,0表示偶数)
(?:(?:[^\\\\](?:\\\\{2})*)|^)%%(.*)%%/
希望这有助于某人
您可以在任何地方使用^
无法相信我所回避的所有时间都在解决这个问题!