Replace 将子字符串作为一个整体替换

Replace 将子字符串作为一个整体替换,replace,julia,string-matching,Replace,Julia,String Matching,我有一个字符串,比如“31.5*q*L^2+831.5*M”。我想将字符串转换为“\num{31.5}qL^2+\num{831.5}*M” 在茱莉亚,我已经尝试过: str="31.5*q*L^2+831.5*M"; temp1=matchall(r"(\d*\.?\d+|\d+\.?\d*)",str); str1=replace(str,temp1[1],"\\num\{"*temp1[1]*"\}"); 然后我得到了意想不到的结果:“\num{31.5}qL^2+8\num{31.5}

我有一个字符串,比如“31.5*q*L^2+831.5*M”。我想将字符串转换为“\num{31.5}qL^2+\num{831.5}*M”

在茱莉亚,我已经尝试过:

str="31.5*q*L^2+831.5*M";
temp1=matchall(r"(\d*\.?\d+|\d+\.?\d*)",str);
str1=replace(str,temp1[1],"\\num\{"*temp1[1]*"\}");
然后我得到了意想不到的结果:“\num{31.5}qL^2+8\num{31.5}*M”

这个问题的解决方案是什么

谢谢

替换(str,r“(\d*\.?\d+\d+\.?\d*)”,s->“\\num\{$s\}”)
可能是所需的解决方案。虽然它确实在
L^2
中取代了指数2。为了避免这种更换,需要更改模式

有关详细信息,请尝试Julia提示符(REPL)上的替换。上述特定方法使用
函数
类型作为
r
参数

可能是
replace
对于一个简单的解决方案来说不够灵活,然后循环可以遍历每个数字并单独替换。这更棘手。请尝试以下代码:

str="31.5*q*L^2+831.5*M"

# The SLOW but more FLEXIBLE way
str1 = ""
lastpos = 1
for m in eachmatch(r"(?:^|[\+\*])(\d*\.?\d+|\d+\.?\d*)",str,false)
    str1=str1*str[lastpos:m.captures[1].offset]*"\\num\{"*m.captures[1]*"\}"
    lastpos = m.captures[1].endof+m.captures[1].offset+1 
end
str1 = str1*str[lastpos:end]

上面使用了
eachmatch
SubString
类型的内部结构。有时候,深入细节是不可避免的。

正则表达式可能需要更多的修改才能获得所需的替换匹配集。太好了。您的解决方案为我节省了数小时的编码时间。例如,当str为“31.5*qL^2+831.5*M-8.1/EI+8.1/(3*a^2+1.5)”[故意在1.5之前添加空格]时,将进行进一步的改进。如下所示:对于每个匹配中的m(r“(?:^+*\-(\])(\d*\.?\d+\.\d+\.?\d)”,str,false)