【问题标题】:Lua: %b with modifiersLua: %b 带修饰符
【发布时间】:2013-02-13 10:59:02
【问题描述】:

我正在尝试匹配包含 Lua 代码的字符串。

a = [[workspace.Object["Child"]:remove()]]

为此,我正在尝试创建一个选项,其中.x['x'] 将被匹配,无论它们的顺序是什么或有多少。

我遇到的几个问题:

  • 如何在括号之间匹配多个组合字符/模式? [abc] 匹配 abc,但不匹配 abc
  • 如何向%b[] 添加修饰符?前任。 %b[]+ 匹配 ['x']['x']['x']
  • 如果我可以匹配 %[.-%] * 之类的内容,那也一样。

【问题讨论】:

  • 您希望您的matchfind 返回什么?
  • 我不想捕捉任何东西,我只是等待它能够识别 xyz 和 x[y][z] 和 x[y].zw[v] 等的任何组合。

标签: string lua pattern-matching string-parsing


【解决方案1】:

Lua 不完全支持正则表达式。
但是您可以使用中间字符串逐步完成任务。

local str0 = [[workspace.Object["Child"]['xx'][5].xxx:remove()]]
local str = str0
   :gsub('%b[]',
      function(s)
         return s:gsub('^%[%s*([\'"]?)(.*)%1%s*%]$','{%2}')
      end
   )
   :gsub('[%.:]%s*([%w_]+)','{%1}')

print(str0)
print(str)
print()
for w in str:gmatch'{(.-)}' do
   print(w)
end

---------------------------
-- output
---------------------------
workspace.Object["Child"]['xx'][5].xxx:remove()
workspace{Object}{Child}{xx}{5}{xxx}{remove}()

Object
Child
xx
5
xxx
remove

编辑:

local str0 = [[workspace.Object["Child"]['xx'][5][ [=[xxx]=] ]:remove()]]
local str = str0
   :gsub('%b[]',
      function(s)
         return s:gsub('^%[%s*([\'"]?).*%1%s*%]$','{%0}')
      end
   )
   :gsub('%.%s*[%w_]+','{%0}')
   :gsub(':%s*[%w_]+%s*([\'"]).-%1','{%0}')
   :gsub(':%s*[%w_]+%s*%b()','{%0}')
   :gsub('{(:%s*remove%s*%(%s*%))}','%1')
   :gsub('}%s*{', '')
   :gsub('([%w_]+)%s*(%b{})%s*:%s*remove%s*%(%s*%)',
      function(s1, s2)
         return 'removefilter('..s1..s2:match'^{(.*)}$'..')'
      end
   )
   :gsub('([%w_]+)%s*:%s*remove%s*%(%s*%)','removefilter(%1)')
   :gsub('[{}]', '')

print(str0)
print(str)

---------------------------
-- output
---------------------------
workspace.Object["Child"]['xx'][5][ [=[xxx]=] ]:remove()
removefilter(workspace.Object["Child"]['xx'][5][ [=[xxx]=] ])

【讨论】:

  • ["']? 是必要的,但是如果字符串在括号中,该怎么办;例如 [[string]]、[=[string]=]、[======等等
  • 是的,事情会写成 [[[Child]]] 或 [[=[Child]=]] 而不是 ["Child"] 另一个问题:如何阅读?它会看到 [[ ]] 并认为 =[Child]= 是字符串,还是会看到 [ ] 并认为它必须索引某些东西并且 [=[ ]=] 表明 Child 必须是字符串?
  • @Waffle - Object[[[Child]]] 不是正确的 Lua 表达式。
  • @Waffle - Object[[=[Child]=]] 试图调用函数Object('=[Child]=')
  • 既然有.*,它无论如何都会捕获[([[Child]])],所以没关系。我最初尝试做的是过滤:remove() 方法并将其变成一个函数,其中workspace.Object:remove() 将变成removefilter(workspace.Object)。鉴于我目前知道该怎么做,我不完全确定如何去做。
猜你喜欢
  • 1970-01-01
  • 2022-09-27
  • 2018-10-01
  • 2011-08-15
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
  • 2022-05-28
  • 2022-06-16
相关资源
最近更新 更多