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和中的值y,sqrt但不获取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例如,避免函数输入)。
非常感谢您的帮助。
由于\(([^()]*)\)( 替换为[$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].