如果其后跟空格和关键字,则正则表达式跳过匹配

regex skip match if its follows by whitespace and a keyword

目前正在尝试将评论与正则表达式匹配,但前提是后面没有函数。 目前我使用的正则表达式也匹配关键字函数。 然后查看源代码(php)是否设置了这个组。

/\/\*\*.*?\*\/\s*(function)?/sg

https://regex101.com/r/l0j1ip/1

现在的问题是是否可以用纯regex来实现。 我已经尝试过简单的负面前瞻,但没有成功。 虽然评论不再单独发了,但是随后续的评论就可以了。

/\/\*\*.*?\*\/\s*(?!function)/sg

https://regex101.com/r/PuUUw6/1

接下来我尝试了非捕获组。但是也没有成功。

/(?:\/\*\*.*?\*\/\s*function)|\/\*\*.*?\*\/\s*/sg

https://regex101.com/r/wkQE7E/1

评论后的信息是(*SKIP)(*FAIL) 我也试过了,没有成功。 跳过此关键字上方的所有匹配项。单场比赛也被跳过。

/\/\*\*.*?\*\/\s*function(*SKIP)(*FAIL)|\/\*\*.*?\*\//sg

https://regex101.com/r/OJSFrF/1

再次阅读问题后,使用负前瞻应该是可行的;重复必须在否定表达式中:

/\/\*\*((?!\*\/).)*\*\/(?!\s*function)/sg

似乎您需要更好地理解回溯是如何工作的,使用 .*? 而不是 .* 意味着正则表达式引擎将首先尝试匹配 .* 之前的所有内容,但是负面的前瞻性匹配失败,.* 继续匹配。使用 ((?!\*\/).)* 无法匹配 \*\/ wheras .*? 可以,回溯后。 另一种解决方案是使用原子组 (?>\/\*\*.*?\*\/)(?!\s*function).

另一个没有 /s 标志的选项可能是

/\*\*(?:[^*]*+|\*(?!/)[^*]*+)*\*/(?!\s*function)

模式匹配:

  • /\*\* 匹配 /**
  • (?:非捕获组
    • [^*]*+ 使用所有格量词
    • 匹配除 * 以外的任何字符
    • |
    • \*(?!/) 匹配 * 后面没有 /
    • [^*]*+ 使用所有格量词
    • 匹配除 * 以外的任何字符
  • )* 关闭非捕获组并可选择重复
  • \*/ 匹配 */
  • (?!\s*function) 否定先行,断言不是可选的空白字符后跟右边的函数

Regex demo

请注意,使用不同的定界符时不必转义反斜杠。

$regex = '~/\*\*(?:[^*]*+|\*(?!/)[^*]*+)*\*/(?!\s*function)~';