我正在使用带有正则表达式内容搜索的文件搜索实用程序(FileSeek).我正在搜索的内容基本上是其中包含的任何未注释的行while...each.我已成功设法排除内联注释行,例如// while (list($key, $value) = each($_GET))使用此正则表达式:^(?:(?!\/\/).)*while.+[\s=(]each[\s(]
如何改进正则表达式搜索(使其更具限制性),以从注释行和注释代码块中排除搜索结果,\* *\例如:
/*
while (list($key, $value) = each($_GET))
*/
Run Code Online (Sandbox Code Playgroud)
要么
/* some code
while (list($key, $value) = each($_GET))
some code
*/
Run Code Online (Sandbox Code Playgroud)
换句话说,如何修改我的正则表达式以完全跳过/忽略注释的php块中的所有内容:\* *\而不是拾取其中的结果?
如果您的工具支持,您可以使用此技巧(*SKIP)(*FAIL)来跳过部分。
(?:(?<!:)\/\/.*|\/\*[\s\S]*?\*\/)(*SKIP)(*F)|while.+?[\s=(]each[\s(]
Run Code Online (Sandbox Code Playgroud)
请参阅 regex101 上的演示。这只是一个快速尝试,您需要根据您的需要调整模式。
如果您的工具不支持此功能,您可以尝试向模式中添加另一个前瞻。
^(?:(?!\/\/).)*while.+[\s=(]each[\s(](?!(?:(?!\/\*)[\S\s])*?\*\/)
Run Code Online (Sandbox Code Playgroud)
打开m多行模式并s关闭单行模式。
或者没有任何标志并使用[^\n]而不是\N为了兼容性。
(?<![^\n])(?:(?!\/\/)[^\r\n])*?while[^\r\n]+[\s=(]each[\s(](?!(?:(?!\/\*)[\S\s])*?\*\/)
Run Code Online (Sandbox Code Playgroud)