记事本++用括号代替parantheses

时间:2016-01-05 10:48:29

标签: 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

我尝试找\((.*)\)并替换为[$1],但它没有得到所有的括号。例如,它会声明xysqrt值,但不会获得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

我发现\((.*)\)并用[$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

我发现\(((?>[^()]|(?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

我发现\(([^()]*)\)一次用[$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

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

1 个答案:

答案 0 :(得分:3)

由于\(([^()]*)\)(替换为[$1])适合您,以下是解释:

\(([^()]*)\)

匹配

  • \( - 一个开头圆括号
  • ([^()]*) - 捕获组1匹配除()以外的零个或多个字符(带[^()]*
  • \) - 结束圆括号

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

回答Aaron关于替换引用字符串中括号的说法,Notepad ++支持Boost条件替换模式是很棒的。我们可以匹配我们不需要修改和替换为self,并使用另一个替换其他匹配。

(?<o1>"[^"\\]*(?:\\.[^"\\]*)*")|(?<o2>\(([^()]*)\))

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

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

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

\(((?>[^()]|(?R))*)\)

并替换为[$1](请参阅demo)。如果您需要替换重叠的括号子串,则需要多次按全部替换

正则表达式解释

\(            # 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

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

(\w+)(\(((?>[^()]|(?2))*)\))

并替换为$1[$3]。见demo

此正则表达式使用{em}重复第二个捕获组子模式的(?2) subroutine

现在,避免匹配这些内部引用的字符串。假设我们有var d = "r(string here)",我们不想在这里将()变为[]。而不是(\w+)(\(((?>[^()]|(?2))*)\))(替换为$1[$3]),请使用

(?<o1>"[^"\\]*(?:\\.[^"\\]*)*")|(?<o2>(\w+)(\(((?>[^()]|(?4))*)\)))

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

enter image description here