我正在将我的代码从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]
,但它没有得到所有的括号。例如,它会声明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
我发现\((.*)\)
并用[$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
函数输入)。
非常感谢你的帮助。
答案 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]
。