【问题标题】:Escaping strings for gsub为 gsub 转义字符串
【发布时间】:2012-03-20 16:18:14
【问题描述】:

我读了一个文件:

local logfile = io.open("log.txt", "r")
data = logfile:read("*a")
print(data)

输出:

...
"(\.)\n(\w)", r"\1 \2"
"\n[^\t]", "", x, re.S
...

是的,日志文件看起来很糟糕,因为它充满了各种命令

如何调用gsub 并从数据变量中删除即"(\.)\n(\w)", r"\1 \2" 行?

低于sn-p,不起作用:

s='"(\.)\n(\w)", r"\1 \2"'
data=data:gsub(s, '')

我想需要进行一些转义。有什么简单的解决办法吗?


更新

local data = [["(\.)\n(\w)", r"\1 \2"
"\n[^\t]", "", x, re.S]]

local s = [["(\.)\n(\w)", r"\1 \2"]]

local function esc(x)
   return (x:gsub('%%', '%%%%')
            :gsub('^%^', '%%^')
            :gsub('%$$', '%%$')
            :gsub('%(', '%%(')
            :gsub('%)', '%%)')
            :gsub('%.', '%%.')
            :gsub('%[', '%%[')
            :gsub('%]', '%%]')
            :gsub('%*', '%%*')
            :gsub('%+', '%%+')
            :gsub('%-', '%%-')
            :gsub('%?', '%%?'))
end

print(data:gsub(esc(s), ''))

这似乎工作正常,只是我需要转义,转义字符%,因为如果% 在匹配的字符串中,它将不起作用。我尝试了:gsub('%%', '%%%%'):gsub('\%', '\%\%'),但它不起作用。


更新 2

好的,% 如果首先在我刚刚更正的“表格”中设置,则可以这样转义

:糟糕的经历:

更新 3

^$ 的转义

如 Lua 手册中所述(5.15.25.3

模式开头的插入符号^ 将匹配锚定在主题字符串的开头。模式末尾的$ 将匹配锚定在主题字符串的末尾。在其他位置,^$ 没有特殊含义,代表自己。

因此,更好的办法是仅在找到 ^$ 时(分别)以及字符串的开头或结尾进行转义。

Lua 5.1 - 5.2+ 不兼容

如果替换字符串包含% 后跟允许的% 或数字以外的字符,string.gsub 现在会引发错误。

不需要将替换字符串中的每个% 都加倍。见lua-users

【问题讨论】:

标签: lua gsub


【解决方案1】:

根据Programming in Lua

The character `%´ works as an escape for those magic characters. So, '%.' matches a dot; '%%' matches the character `%´ itself. You can use the escape `%´ not only for the magic characters, but also for all other non-alphanumeric characters. When in doubt, play safe and put an escape.

这是否意味着您可以简单地将% 放在每个非字母数字字符的前面就可以了。这也将是未来的证明(在引入新的特殊字符的情况下)。像这样:

function escape_pattern(text)
    return text:gsub("([^%w])", "%%%1")
end

它在 Lua 5.3.2 上对我有用(只进行了初步测试)。不确定它是否适用于旧版本。

【讨论】:

    【解决方案2】:

    为什么不:

    local quotepattern = '(['..("%^$().[]*+-?"):gsub("(.)", "%%%1")..'])'
    string.quote = function(str)
        return str:gsub(quotepattern, "%%%1")
    end
    

    逃跑然后gsub它离开?

    【讨论】:

      【解决方案3】:

      试试

      line = '"(\.)\n(\w)", r"\1 \2"'
      rx =  '\"%(%\.%)%\n%(%\w%)\", r\"%\1 %\2\"'
      print(string.gsub(line, rx, ""))
      

      用 % 转义特殊字符,用 \ 转义引号

      【讨论】:

      • 由于我的脚本中的s 是可变的,而不是硬编码的字符串,您能否提供更多信息,说明哪些字符需要为gsub 转义?作为一种解决方法,我创建了将字符串转换为字节序列并再次返回的函数,但后来发现我无法告诉 Lua 将字节转换为字符串,除了 ASCII。
      • 请参阅有关模式的参考手册以确定需要转义的内容lua.org/manual/5.1/manual.html#5.4.1。在上面的例子中,括号和反斜杠是特殊字符,因为它们在模式匹配方案中用于确定特殊结构(捕获或指示特殊字符)。
      【解决方案4】:

      试试s=[["(\.)\n(\w)", r"\1 \2"]]

      【讨论】:

      • 谢谢,但由于某种原因仍然没有运气
      • 如果文件被逐行读取并与 s 相比,这将起作用,但不适用于 gsub
      猜你喜欢
      • 2022-06-17
      • 2016-06-16
      • 1970-01-01
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      • 2019-05-18
      • 2013-01-29
      相关资源
      最近更新 更多