我試圖得到一個像這樣的字串:
"1d6 1d12-1d20 5"
并把它變成這樣:"rolar('1d6') rolar('1d12')-rolar('1d20') 5"
要點是xdy應該替換rolar('xdy')為該部分中的原始值。我一直在嘗試這樣做,string:gsub但無法保持原始 xdy 值。
uj5u.com熱心網友回復:
這種模式只是“一個或多個數字,然后是字母d,然后是一個或多個數字”。將其替換為包含在字串文字 & func 呼叫中的捕獲rolar。
str:gsub("%d d%d ", "rolar('%1')")
你的字串在哪里str- 例如:
> ("1d6 1d12-1d20 5"):gsub("%d d%d ", "rolar('%1')")
rolar('1d6') rolar('1d12')-rolar('1d20') 5 3
(第二個回傳值 ,3是由 執行的替換次數gsub;您可能不需要它)
我假設您的下一步將是loadstring此代碼以對其進行評估。這樣做時要非常小心;至少使用沙盒環境(即,不訪問任何全域變數的環境,理想情況下,即使是臨時更改的字串元表)。這甚至不能防止簡單的 DoS 攻擊while 1 do end,但至少它不會使擦除檔案系統變得微不足道。
uj5u.com熱心網友回復:
如果您確定輸入將始終處于這樣的配置中,則可以使用 gsub 執行此操作,使用捕獲組(字串模式周圍的括號)。
str:gsub("(%d d%d )", function(roll) return "rolar('"..roll.."')" end)
捕獲的模式%d d%d將作為引數傳遞給您提供給 gsub 的函式,然后您可以使用所需的任何修改重新插入到字串中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/488825.html
