在 Notepad++ 中使用正则表达式 (RegEx) 切换字符串位置

Switch String Position Using Regular Expression (RegEx) in Notepad++

我在 C 代码中有以下模式:

#if defined (_MSC_VER)
    double CC[16] __declspec(align(64)) = {0};
#else
    double CC[16] __attribute__ ((aligned (64))) = {0};
#endif

这是一个错误,因为它应该是 __declspec(align(64)) double CC[16] = {0};

我想使用正则表达式在许多文件中修复它。如果表达式的格式与 Notepad++ 兼容,我会很高兴。

所以我需要的是捕获以下项目的东西:

  1. double CC[ <dontCare> ] - 以字母开头的东西(不捕获制表符或 spaces 的行的开头)直到它看到 __declspec(注意 space 在 __declspec 之前)。
  2. __declspec 开头并以 )) 结尾的内容。
  3. )) 之后的所有内容,直到并包括 ;

然后我想把它们按正确的顺序排列:<2nd Item> <1st Item><3rd Item>(最小 space 在第一项和第二项之间)。

解决方案应该是稳健的,因为有时是这样的:

#if defined (_MSC_VER) && !defined(__clang__)
    double pU[3*4*K_MAX_STACK] __declspec(align(64));
#else
    double pU[3*4*K_MAX_STACK] __attribute__ ((aligned (64)));
#endif

我在 https://regex101.com/r/xzUcAt/1 尝试了一些东西,但收效甚微(不!)。

备注: 我遇到这个问题是因为 I found a bug in BLASFeo(用于小矩阵的开源 BLAS 库),我想帮助解决这个问题。

解决方案

根据@CasNouwens 的回答,我完成了 99% 的工作:

\b(.*?])\s(__declspec.+?\)\))(.*?;)

解决方案位于 https://regex101.com/r/xzUcAt/10

看看这个正则表达式,看看它是否适合你?

\b(.*?)(\s__declspec.+?\)\))(.*?;)

https://regex101.com/r/xzUcAt/6

  • 第一组收集 double 的声明,包括方括号内的任何内容。例如:double CC[16]

  • 第二组从 __declspec 收集到并包括两个右括号 )),示例:</code> <code>__declspec(align(64)) (注意,它也收集 __declspec 之前的 space)

  • 第三组收集这两个右括号之后的所有内容,直到并包括分号 ;。例如:</code> <code>= {0};

使用 Regex101 替换函数: 它会产生您所请求的结果。

让我知道是否有帮助或是否需要解释。

注意: OP 使用的最终正则表达式是:

\b(.+?)\s(__declspec.+?\)\))(.*?;)