1

我正在尝试function使用 Oniguruma 正则表达式(用于 VSCode 语法突出显示)将单词捕获到 2 个不同的组中,具体取决于::前面的字符。据我所知 Oniguruma 不支持条件,因此我认为如果字符不存在,我可以将正则表达式结果捕获到第 1 组,如果它们存在,我可以捕获到第 2 组

目前,我有以下内容:

(?>::\s*\b(function)\b)|\b(function)\b

一些文本来测试代码:

  integer function fun_with_func_space(     function    )
    integer, intent(inout) :: function
  end function fun_with_func_space

预期的正则表达式匹配

鉴于上面的文字组$1应该

finds 1st and 2nd "function" in 'integer function fun_with_func_space(     function    )'
finds no match in 'integer, intent(inout) :: function'
finds "function" in 'end function fun_with_func_space'

另一方面,组 $2 应该

finds no match in 'integer function fun_with_func_space(     function    )'
find "function" in 'integer function fun_with_func_space(     function    )'
finds no match in 'end function fun_with_func_space'

据我了解,以下内容应表示:“捕获并退出第 2 组单词functionif 前面有 :: else capture functionin group 1。” 并且根据 regex101.com 它应该可以工作:https://regex101.com/r/VtgeTD/1,但我的语法突出显示仍然失败。难道我做错了什么?

4

1 回答 1

3

尝试使用向后看:

(?<=::|:: )\b(function)\b|\b(function)\b

现场演示

或使用非捕获组:

(?:::\s*)(function)\b|\b(function)\b

现场演示

于 2021-10-10T19:29:12.887 回答