我学习了正则表达式,并且尝试仅在函数内部匹配某些东西。
test() {
stack();
overflow;
stack;
overflow();
}
我只想在函数内匹配所有 stack 字。
我的想法是
1)看是否存在() {
。 (?<=\(\) {)
2)逐字符转到字符(也为空格)并检查:
第一个字符是s
吗?
如果是,请在前面:第二个字符t
?等
如果否,请在下一个字符之前再次检查:第一个字符是s
吗?
我还知道\K
会消失已经匹配的内容。
我不知道该怎么实现。
答案 0 :(得分:1)
对于示例数据,如果要匹配所有 stack 词,则还可以使用可选的捕获组并使用\G
锚点。
(?:[^\s()]+\(\)\h*{(?=[^{}]+\r?\n}$)|\G(?!^))\r?\n\h+(stack\b)?\S*
关于模式
(?:
非捕获组
[^\s()]+\(\)\h*{
匹配函数名称()
和{
(?=[^{}]+\r?\n}$)
在字符串的开头声明}
|
或\G(?!^)
在上一场比赛的末尾而不是在开始时断言)
关闭非捕获组\r?\n\h+
匹配换行符和1个以上水平空格字符(stack\b)?\S* Optionally capture
堆栈`,后跟0+个非空格字符答案 1 :(得分:0)
(?m)(?:\(\s*\)\s*{(?=[^{}]*})|(?!^)\G)(?s:(?![{}]).)*?\K\bst.*?(?=\h*$)
https://regex101.com/r/UOYxUB/1
(?m)
(?:
\( \s* \) \s* {
(?= [^{}]* } )
| (?! ^ )
\G
)
(?s:
(?! [{}] )
.
)*?
\K
\b
st .*?
(?= \h* $ )