notepad++ 用括号替换括号

myG*_*atz 2 regex matlab notepad++ julia


我正在将我的代码从 MATLAB 转换为 julia,因此我需要替换用于索引的括号:它们是 MATLAB 中的类型和julia 中的()类型。[]两个函数括号的类型相同,即().
我认为最快的方法是使用 Notepad++,找到所有括号,然后在需要时用括号替换它们。
无论如何,它没有按预期工作。

我不会复制我现在正在转换的所有函数,而是复制某些部分作为示例:

x= coord(:,1);
y= coord(:,2);

natG_coord(1,1)=  sqrt(1/3);
natG_coord(2,1)= -sqrt(1/3);
natG_coord(3,1)= -sqrt(1/3);
natG_coord(4,1)=  sqrt(1/3);

for i=1:4
    dNG(1,i)=  (1+etaG(i))/4 + csiG(i)*(1+etaG(i))/2 - (1-etaG(i)^2)/4 - 2*csiG(i)*(1-etaG(i)^2)/4;
    dNG(2,i)= -(1+etaG(i))/4 + csiG(i)*(1+etaG(i))/2 + (1-etaG(i)^2)/4 - 2*csiG(i)*(1-etaG(i)^2)/4;
    dNG(3,i)= -(1-etaG(i))/4 + csiG(i)*(1-etaG(i))/2 + (1-etaG(i)^2)/4 - 2*csiG(i)*(1-etaG(i)^2)/4;
    dNG(4,i)=  (1-etaG(i))/4 + csiG(i)*(1-etaG(i))/2 - (1-etaG(i)^2)/4 - 2*csiG(i)*(1-etaG(i)^2)/4;
end
Run Code Online (Sandbox Code Playgroud)

我尝试查找\((.*)\)并替换为[$1],但它没有得到所有括号。例如,它获取声明x和中的值ysqrt但不获取natG_coord索引。在for循环中,它只获取每行的最后一个表达式,即(1-etaG(i)^2),但获取外部括号,而不是etaG索引(这实际上是我需要替换的)。

我看不到选择的模式,因此无法提出解决方案。
其他不生气的解决方案通过括号来完成这个括号就可以了!
感谢大家的帮助。

编辑
@stribizhev:最终结果应该是这样的:

x= coord[:,1]
y= coord[:,2]

natG_coord[1,1]=  sqrt(1/3)
natG_coord[2,1]= -sqrt(1/3)
natG_coord[3,1]= -sqrt(1/3)
natG_coord[4,1]=  sqrt(1/3)

for i=1:4
  dNG[1,i]=  (1+etaG[i])/4 + csiG[i]*(1+etaG[i])/2 - (1-etaG[i]^2)/4 - 2*csiG[i]*(1-etaG[i]^2)/4
  dNG[2,i]= -(1+etaG[i])/4 + csiG[i]*(1+etaG[i])/2 + (1-etaG[i]^2)/4 - 2*csiG[i]*(1-etaG[i]^2)/4
  dNG[3,i]= -(1-etaG[i])/4 + csiG[i]*(1-etaG[i])/2 + (1-etaG[i]^2)/4 - 2*csiG[i]*(1-etaG[i]^2)/4
  dNG[4,i]=  (1-etaG[i])/4 + csiG[i]*(1-etaG[i])/2 - (1-etaG[i]^2)/4 - 2*csiG[i]*(1-etaG[i]^2)/4
end
Run Code Online (Sandbox Code Playgroud)

我一次找到\((.*)\)并替换的是:[$1]

x= coord[:,1];
y= coord[:,2];

natG_coord[1,1)=  sqrt(1/3];
natG_coord[2,1)= -sqrt(1/3];
natG_coord[3,1)= -sqrt(1/3];
natG_coord[4,1)=  sqrt(1/3];

for i=1:4
    dNG[1,i)=  (1+etaG(i))/4 + csiG(i)*(1+etaG(i))/2 - (1-etaG(i)^2)/4 - 2*csiG(i)*(1-etaG(i)^2]/4;
    dNG[2,i)= -(1+etaG(i))/4 + csiG(i)*(1+etaG(i))/2 + (1-etaG(i)^2)/4 - 2*csiG(i)*(1-etaG(i)^2]/4;
    dNG[3,i)= -(1-etaG(i))/4 + csiG(i)*(1-etaG(i))/2 + (1-etaG(i)^2)/4 - 2*csiG(i)*(1-etaG(i)^2]/4;
    dNG[4,i)=  (1-etaG(i))/4 + csiG(i)*(1-etaG(i))/2 - (1-etaG(i)^2)/4 - 2*csiG(i)*(1-etaG(i)^2]/4;
end
Run Code Online (Sandbox Code Playgroud)

我一次找到\(((?>[^()]|(?R))*)\)并替换所有内容[$1]的是(我知道你说过好几次了,如果我这样做,它最终会替换所有匹配的大括号):

x= coord[:,1];
y= coord[:,2];

natG_coord[1,1]=  sqrt[1/3];
natG_coord[2,1]= -sqrt[1/3];
natG_coord[3,1]= -sqrt[1/3];
natG_coord[4,1]=  sqrt[1/3];

for i=1:4
    dNG[1,i]=  [1+etaG(i)]/4 + csiG[i]*[1+etaG(i)]/2 - [1-etaG(i)^2]/4 - 2*csiG[i]*[1-etaG(i)^2]/4;
    dNG[2,i]= -[1+etaG(i)]/4 + csiG[i]*[1+etaG(i)]/2 + [1-etaG(i)^2]/4 - 2*csiG[i]*[1-etaG(i)^2]/4;
    dNG[3,i]= -[1-etaG(i)]/4 + csiG[i]*[1-etaG(i)]/2 + [1-etaG(i)^2]/4 - 2*csiG[i]*[1-etaG(i)^2]/4;
    dNG[4,i]=  [1-etaG(i)]/4 + csiG[i]*[1-etaG(i)]/2 - [1-etaG(i)^2]/4 - 2*csiG[i]*[1-etaG(i)^2]/4;
end
Run Code Online (Sandbox Code Playgroud)

我发现用一次\(([^()]*)\)替换所有内容是:[$1]

x= coord[:,1];
y= coord[:,2];

natG_coord[1,1]=  sqrt[1/3];
natG_coord[2,1]= -sqrt[1/3];
natG_coord[3,1]= -sqrt[1/3];
natG_coord[4,1]=  sqrt[1/3];

for i=1:4
    dNG[1,i]=  (1+etaG[i])/4 + csiG[i]*(1+etaG[i])/2 - (1-etaG[i]^2)/4 - 2*csiG[i]*(1-etaG[i]^2)/4;
    dNG[2,i]= -(1+etaG[i])/4 + csiG[i]*(1+etaG[i])/2 + (1-etaG[i]^2)/4 - 2*csiG[i]*(1-etaG[i]^2)/4;
    dNG[3,i]= -(1-etaG[i])/4 + csiG[i]*(1-etaG[i])/2 + (1-etaG[i]^2)/4 - 2*csiG[i]*(1-etaG[i]^2)/4;
    dNG[4,i]=  (1-etaG[i])/4 + csiG[i]*(1-etaG[i])/2 - (1-etaG[i]^2)/4 - 2*csiG[i]*(1-etaG[i]^2)/4;
end
Run Code Online (Sandbox Code Playgroud)

所以最后一个正是我正在寻找的。一旦我使用“查找下一个”命令,我就可以决定它们是否索引括号并替换它们(sqrt例如,避免函数输入)。
非常感谢您的帮助。

Wik*_*żew 6

由于\(([^()]*)\)( 替换为[$1]) 对您有用,因此解释如下:

\(([^()]*)\)
Run Code Online (Sandbox Code Playgroud)

火柴:

  • \(- 一个开口圆括号
  • ([^()]*)- 捕获组 1 匹配除(和之外的零个或多个字符)(带有[^()]*
  • \)- 右圆括号

上面的正则表达式将匹配所有最后嵌套级别的括号,这些括号内没有任何括号

回答 Aaron 关于替换引用字符串内的括号的评论,Notepad++ 支持 Boost 条件替换模式真是太棒了。我们可以将不需要修改的部分用 self 来匹配和替换,而其他匹配项则使用另一个替换

(?<o1>"[^"\\]*(?:\\.[^"\\]*)*")|(?<o2>\(([^()]*)\))
Run Code Online (Sandbox Code Playgroud)

并替换为(?{o1}$+{o1}:[$3]).

请注意,"[^"\\]*(?:\\.[^"\\]*)*"正确有效地将 C 字符串与转义实体进行匹配。替换模式意味着替换为带引号的字符串(如果o1组匹配)或[+组 3 值+ ](如果其他组匹配)。

如果需要替换外部平衡括号,请使用

\(((?>[^()]|(?R))*)\)
Run Code Online (Sandbox Code Playgroud)

并替换为[$1](参见演示)。如果需要替换重叠的括号子字符串,则需要多次单击“全部替换” 。

正则表达式解释

\(            # an outer literal opening round bracket
   (          #  start group 1
     (?>      #   start of atomic group
       [^()]  #     any character other than ( and )
       |      #    OR
       (?R)   #     recursively match the whole pattern
     )*       #   end atomic group and repeat zero or more times
   )          #  end of group 1
\)            #   match a literal closing round bracket
Run Code Online (Sandbox Code Playgroud)

如果需要替换这些括号的字符串前面应带有单词字符,请使用

(\w+)(\(((?>[^()]|(?2))*)\))
Run Code Online (Sandbox Code Playgroud)

并替换为$1[$3]. 查看演示

此正则表达式使用(?2) 重复第二个捕获组子模式的子例程。

现在,避免匹配这些内部带引号的字符串。假设我们已经var d = "r(string here)"并且不想将其转到()此处[]。代替(\w+)(\(((?>[^()]|(?2))*)\))$1[$3]替换),使用

(?<o1>"[^"\\]*(?:\\.[^"\\]*)*")|(?<o2>(\w+)(\(((?>[^()]|(?4))*)\)))
Run Code Online (Sandbox Code Playgroud)

(?{o1}$+{o1}:$3[$5])作为替补。这将使var d = "r(string here)"字符串保持完整,并将var f = a(fg()g)变成var f = a[fg()g].

在此输入图像描述

  • 如果这还不够,我不知道还会有什么!感谢您让我发现了 Boost! (2认同)