2016-02-26 61 views
1

我有一個字符串,如「31.5 * q * L^2 + 831.5 * M」。我想將字符串轉換爲「\ num {31.5} q L^2 + \#N * {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」。

這個問題的解決方案是什麼?

謝謝

回答

2

replace(str,r"(\d*\.?\d+|\d+\.?\d*)",s->"\\num\{$s\}")可能是需要的解決方案。儘管它也取代L^2中的指數2。爲了避免這種替換,需要更改模式。

欲瞭解更多信息請試用?replace關於Julia提示(REPL)。上述具體方法使用r參數的Function類型。

這可能是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類型的內部結構。有時進入細節是不可避免的。

+0

正則表達式可能需要稍微擺弄一下才能得到所需的一組替換匹配。 –

+1

太好了。您的解決方案可節省數小時的編碼。例如,當str爲「31.5 * q * L^2 + 831.5 * M-8.1/EI + 8.1 /(3 * a^2 + 1.5)」時,進一步改進將處理這種情況「 。它如下:對於每個匹配中的m(r「(?:^ | [\ + \ * \ - \(\])(\ d * \。?\ d + | \ d + \。?\ d *)」 STR,FALSE) –