匹配 Lua 中的单词或空格

Match a word or whitespaces in Lua

(抱歉我的英语不好)
我想要做的是在 Lua. 例如:

local my_string = "foo bar"
my_string:match(regex)    --> should return 'foo', ' ', 'bar'

my_string = "   123!@."     -- note: three whitespaces before '123!@.'
my_string:match(regex)    --> should return ' ', ' ', ' ', '123!@.'

其中 regex 是我要的 Lua 正则表达式模式。 当然,我对 Google 做了一些研究,但我找不到任何有用的东西。到目前为止我得到的是 [%s%S]+[%s+%S+] 但它似乎不起作用。

任何使用标准库的解决方案,例如string.findstring.gmatch等都可以。

匹配 returns 捕获或整个匹配,您的模式没有定义这些。 [%s%S]+ 匹配 "(space or not space) multiple times more than once",基本上 - 一切。 [%s+%S+] 完全错误,字符 class [ ] 是一组单个字符成员,它不会以任何其他方式处理字符序列("[cat]" 匹配 "c""a"),也不关心 +[%s+%S+] 可能是 "(a space or plus or not space or plus) single character"

第一个例子 'foo', ' ', 'bar' 可以通过以下方式解决:

regex="(%S+)(%s)(%S+)"

如果您想要可变数量的捕获,您将需要 gmatch 迭代器:

local capt={}
for q,w,e in my_string:gmatch("(%s*)(%S+)(%s*)") do
  if q and #q>0 then
    table.insert(capt,q)
  end
  table.insert(capt,w)
  if e and #e>0 then
    table.insert(capt,e)
  end
end

然而,这不会检测前导 space 或区分单个 space 和多个,您需要将这些检查添加到匹配结果处理中。

Lua 标准模式很简单,如果你需要更复杂的匹配,你可能想看看 lua lpeg 库。