如果其后跟空格和关键字,则正则表达式跳过匹配
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
再次阅读问题后,使用负前瞻应该是可行的;重复必须在否定表达式中:
/\/\*\*((?!\*\/).)*\*\/(?!\s*function)/sg
似乎您需要更好地理解回溯是如何工作的,使用 .*?
而不是 .*
意味着正则表达式引擎将首先尝试匹配 .*
之前的所有内容,但是负面的前瞻性匹配失败,.*
继续匹配。使用 ((?!\*\/).)*
无法匹配 \*\/
wheras .*?
可以,回溯后。
另一种解决方案是使用原子组 (?>\/\*\*.*?\*\/)(?!\s*function)
.
另一个没有 /s
标志的选项可能是
/\*\*(?:[^*]*+|\*(?!/)[^*]*+)*\*/(?!\s*function)
模式匹配:
/\*\*
匹配 /**
(?:
非捕获组
[^*]*+
使用所有格量词 匹配除 *
以外的任何字符
|
或
\*(?!/)
匹配 *
后面没有 /
[^*]*+
使用所有格量词 匹配除 *
以外的任何字符
)*
关闭非捕获组并可选择重复
\*/
匹配 */
(?!\s*function)
否定先行,断言不是可选的空白字符后跟右边的函数
请注意,使用不同的定界符时不必转义反斜杠。
$regex = '~/\*\*(?:[^*]*+|\*(?!/)[^*]*+)*\*/(?!\s*function)~';
目前正在尝试将评论与正则表达式匹配,但前提是后面没有函数。 目前我使用的正则表达式也匹配关键字函数。 然后查看源代码(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
再次阅读问题后,使用负前瞻应该是可行的;重复必须在否定表达式中:
/\/\*\*((?!\*\/).)*\*\/(?!\s*function)/sg
似乎您需要更好地理解回溯是如何工作的,使用 .*?
而不是 .*
意味着正则表达式引擎将首先尝试匹配 .*
之前的所有内容,但是负面的前瞻性匹配失败,.*
继续匹配。使用 ((?!\*\/).)*
无法匹配 \*\/
wheras .*?
可以,回溯后。
另一种解决方案是使用原子组 (?>\/\*\*.*?\*\/)(?!\s*function)
.
另一个没有 /s
标志的选项可能是
/\*\*(?:[^*]*+|\*(?!/)[^*]*+)*\*/(?!\s*function)
模式匹配:
/\*\*
匹配/**
(?:
非捕获组[^*]*+
使用所有格量词 匹配除 |
或\*(?!/)
匹配*
后面没有/
[^*]*+
使用所有格量词 匹配除
*
以外的任何字符*
以外的任何字符)*
关闭非捕获组并可选择重复\*/
匹配*/
(?!\s*function)
否定先行,断言不是可选的空白字符后跟右边的函数
请注意,使用不同的定界符时不必转义反斜杠。
$regex = '~/\*\*(?:[^*]*+|\*(?!/)[^*]*+)*\*/(?!\s*function)~';