替换子串作为一个整体

时间:2016-02-26 14:36:33

标签: replace julia string-matching

我有一个字符串,例如" 31.5 * q * L ^ 2 + 831.5 * M"。我希望将字符串转换为" \ num {31.5} q L ^ 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} q L ^ 2 + 8 \ num {31.5} * M"。

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

谢谢

1 个答案:

答案 0 :(得分:2)

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

有关更多信息,请在Julia提示符(REPL)上尝试?replace。上面的具体方法对Function参数使用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]

以上使用eachmatchSubString类型的内部。有时候进入细节是不可避免的。