2

I want to replace string in lua. Here is the string.

strng='\begin{matrix}   1 & 2 & 3 \\    4 & 5 & 6 \\    7 & 8 & 10 \end{matrix}'

I want to replace

\begin{matrix} by {{
& by ,
\\ by },{
\end{matrix} by }}

I also want to remove all spaces. So the output will be

{{1,2,3},{4,5,6},{7,8,10}}

I have written the following function to do this.

function tempsubst(m1)
m1 = matrixprint(m1)
if type(m1) ~="string" then  return  m1 end
m1 = string.gsub(m1,"\begin%{matrix%}","{{" )
m1 = string.gsub(m1,"\\","},{" )
m1 = string.gsub(m1,"%&","," )
m1 = string.gsub(m1,"end%{matrix%}","}}" )
m1= string.gsub(m1 , "%s+", "")
return m1
end

This sometimes work but sometimes it does not work. There must be mistakes in the function. I am newbie to lua. Could the code be corrected? Any help will be appreciated. Thanks.

Maths89
  • 476
  • 3
  • 15
  • sometimes it does not work is not the best problem description. provide example inputs and outputs. – Piglet Jul 26 '19 at 07:44
  • If input is passed from some other function, it gives unexpected output. tempsubst(strng) works but tempsubst(somefunction(x)) doesn't work. Note that somefunction(x) gives string as output. I think apostrophe may be causing the problem. – Maths89 Jul 26 '19 at 07:52
  • All backslashes inside `"literal string"` must be doubled. – Egor Skriptunoff Jul 26 '19 at 08:02

2 Answers2

1

When confused with escapes and backslashes, it's better to use long strings, which don't interpret those:

m1=[[\begin{matrix}   1 & 2 & 3 \\    4 & 5 & 6 \\    7 & 8 & 10 \end{matrix}]]
print(m1)
m1 = string.gsub(m1,[[\begin{matrix}]],"{{" )
m1 = string.gsub(m1,[[\\]],"},{" )
m1 = string.gsub(m1,[[&]],"," )
m1 = string.gsub(m1,[[\end{matrix}]],"}}" )
m1= string.gsub(m1 , [[%s+]], "")
print(m1)
lhf
  • 70,581
  • 9
  • 108
  • 149
  • Can you tell me how to convert m1='\begin{matrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 10 \end{matrix}' to m1=[[\begin{matrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 10 \end{matrix}]]? – Maths89 Jul 26 '19 at 14:29
0

First of all your strings contain two escape sequences "\b" and "\e".

I suppose you mean "\\b"? Escape each backslash!

Then you have the problem that you replace "\\" at any position with "},{". But at "\\end" you don't want that.

Because of that, after fixing the escape problem you get this output:

{{1,2,3},{4,5,6},{7,8,10},{}}

So either replace \\ends first or change the other pattern so it won't affect "\\end"

Edit: if you get a string from outside like

\\

your pattern is "\\\\" as you have to create a literal string with 2 backslashs which requires you to escape both, resulting in four backslashs. This pattern matches two backslash characters in a string.

Piglet
  • 27,501
  • 3
  • 20
  • 43