Lua pattern matching problem with escaped letter

Viewed 43

I've already had a rule that \ should be replaced with \\\\ , so the existed code is

string.gsub(s, '\\', '\\\\\\\\')

but there is some data that should not be converted, such as abc\"cba, which will be replaced with abc\\\\"cba.

How can I constraint that only \ followed without " can be replaced, such like


'abc\abc' -> 'abc\\\\abc'

'abc\"abc' -> 'abc\"abc'

I have used patterns like \\[^\"]- and \\[^\"]+- but none of them works.

Thanks

1 Answers

You can use

string.gsub((s .. ' '), '\\([^"])', '\\\\\\\\%1'):sub(1, -2)

See the online demo:

local s = [[abc\abc abc\"abc\]];
s = string.gsub((s .. ' '), '\\([^"])', '\\\\\\\\%1'):sub(1, -2)
print( s );
-- abc\\\\abc abc\"abc\\\\

Notes:

  • \\([^"]) - matches two chars, a \ and then any one char other than a " char (that is captured into Group 1)
  • \\\\\\\\%1 - replacement pattern that replaces each match with 4 backslashes and the value captured in Group 1
  • (s .. ' ') - a space is appended at the end of the input string so that the pattern could consume a char other than a " char
  • :sub(1, -2) - removes the last "technical" space that was added.
Related