学习正则表达式,内部匹配单词

时间:2019-08-21 00:07:59

标签: regex

我学习了正则表达式,并且尝试仅在函数内部匹配某些东西。

test() {
    stack();
    overflow;
    stack;
    overflow();
}

我只想在函数内匹配所有 stack 字。

我的想法是

1)看是否存在() {(?<=\(\) {)

2)逐字符转到字符(也为空格)并检查:

第一个字符是s吗?

如果是,请在前面:第二个字符t?等

如果否,请在下一个字符之前再次检查:第一个字符是s吗?

我还知道\K会消失已经匹配的内容。

我不知道该怎么实现。

2 个答案:

答案 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+个非空格字符

Regex demo

答案 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* $ )