在 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++
兼容,我会很高兴。
所以我需要的是捕获以下项目的东西:
double CC[ <dontCare> ]
- 以字母开头的东西(不捕获制表符或 spaces 的行的开头)直到它看到 __declspec
(注意 space 在 __declspec
之前)。
- 以
__declspec
开头并以 ))
结尾的内容。
))
之后的所有内容,直到并包括 ;
。
然后我想把它们按正确的顺序排列:<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
- 捕获新单词开头之前的所有内容。
(.*?])
- 捕获第一个 ]
之前的任何字符。另存为 </code>.</li>
<li><code>\s
- 捕获任何 spaces 或任何 White Space(制表符等...)。
(__declspec.+?\)\))
- 捕获以 __declspec
开头并以第一个 ))
结尾的任何字符集。另存为 </code>.</li>
<li><code>(.*?;)
- 捕获所有内容(包括 White Spaces)直到第一个 ;
。将其另存为 </code>.</li>
</ul>
<p>新字符串由<code>
给出。
这也适用于 grepWin。
看看这个正则表达式,看看它是否适合你?
\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.+?\)\))(.*?;)
我在 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++
兼容,我会很高兴。
所以我需要的是捕获以下项目的东西:
double CC[ <dontCare> ]
- 以字母开头的东西(不捕获制表符或 spaces 的行的开头)直到它看到__declspec
(注意 space 在__declspec
之前)。- 以
__declspec
开头并以))
结尾的内容。 ))
之后的所有内容,直到并包括;
。
然后我想把它们按正确的顺序排列:<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
- 捕获新单词开头之前的所有内容。(.*?])
- 捕获第一个]
之前的任何字符。另存为</code>.</li> <li><code>\s
- 捕获任何 spaces 或任何 White Space(制表符等...)。(__declspec.+?\)\))
- 捕获以__declspec
开头并以第一个))
结尾的任何字符集。另存为</code>.</li> <li><code>(.*?;)
- 捕获所有内容(包括 White Spaces)直到第一个;
。将其另存为</code>.</li> </ul> <p>新字符串由<code>
给出。这也适用于 grepWin。
看看这个正则表达式,看看它是否适合你?
\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.+?\)\))(.*?;)