正则表达式,如果有什么东西,请确保它不是什么

时间:2014-03-18 23:28:42

标签: regex

对于模糊的标题感到抱歉,我必须做很多事情并且我避免使用REGEX(直接,我最终将其包装起来),我现在认为这种情况太常见而不能解决。

反斜杠逃脱!我正在用%%替换%%和结束%%之间的文本,但我希望能够编写%%。

我想说如果在%%之前有一些东西,那么请确保它不是\,例如:

[^\]%%不会工作,因为它不会在字符串的开头处得到东西。

[^\]?%%无法正常工作,因为如果是反斜杠,则可选。


我写这篇文章的时候只是想了一下!

/(?:(?:(?:\\\\{2})+)|[^\\\\])%%(.*)%%/(注意\\是正则表达式中的字母反斜杠。

将其读作"(非零偶数反斜杠或不反斜杠),然后是%% ...."

如果没有测试,您可以看到这不会起作用,因为给定\\\%%stuff%%正则表达式引擎会看到\\%%stuff%%(在第一个\之后是一个偶数)

所以

/(?:(?:[^\\\\](?:\\\\{2})+)|[^\\\\])%%(.*)%%/似乎是下一步,这就是

"((不是反斜杠)后跟偶数个反斜杠或不是反斜杠)后跟%% ..."

哪个更近了!我们现在有字符串的开头问题,我们也可能将正则表达式考虑在内:

/(?:[^\\\\](?:\\\\{2})*)%%(.*)%%/这是"不是反斜杠后跟任何偶数个反斜杠后跟%% ...."这几乎是伟大的!

然后我发现了一些魔法,因为这是如此的关闭,正如我所说,我无法相信这还没有完成,请参阅答案。

1 个答案:

答案 0 :(得分:0)

您可能知道,至少使用PERL正则表达式,^表示字符串开头(在类中未找到),$表示结束。这些很棒,因为它们意味着像^a这样的规则匹配以a开头的字符串(有时是行),而不是它在任何地方找到的第一个字符串。

它突然袭击了我,在#34;字符串"开始时没有任何技术上的困难。作为基于它的输入和转换状态! (正则表达式被编译为"确定性有限自动机 - 状态机!)所以我认为我用^来测试它,所以现在它是"(不反斜杠后跟偶数个反斜杠或者字符串的开头)后跟%% ...."

/(?:(?:[^\\\\](?:\\\\{2})+)|[^\\\\]|^)%%(.*)%%/可以写成(通过识别0反斜杠的情况,0表示偶数)

(?:(?:[^\\\\](?:\\\\{2})*)|^)%%(.*)%%/

希望这有助于某人

您可以在任何地方使用^

无法相信我所回避的所有时间都在解决这个问题!