【问题标题】:Match a word or whitespaces in Lua匹配 Lua 中的单词或空格
【发布时间】:2017-10-21 09:41:56
【问题描述】:

(对不起,我的英语不好)
我要做的是在 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 正则表达式模式。 当然,我在谷歌上做了一些研究,但我找不到任何有用的东西。到目前为止我得到的是[%s%S]+[%s+%S+],但它似乎不起作用。

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

【问题讨论】:

  • 从描述看来,模式应该用一个空格分隔,但您尝试过的示例都匹配一个或多个。
  • @Dimitry 我的标题提到了“一个单词或空格”,其中“空格”是复数形式,所以多个空格一个单词。描述中也一样。正如我所说,我的英语远不是最好的,所以如果我错了,请纠正我。

标签: lua lua-patterns


【解决方案1】:

Match 返回捕获或整个匹配,您的模式没有定义这些。 [%s%S]+ 匹配 "(space or not space) multiple times more than once",基本上 - 一切。 [%s+%S+] 完全错误,字符类 [ ] 是一组单个字符成员,它不以任何其他方式处理字符序列("[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

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

Lua 标准模式非常简单,如果您需要更复杂的匹配,您可能需要查看 lua lpeg 库。

【讨论】:

  • 感谢您的回答。我对 Lua 模式的理解非常有限,所以也谢谢你的解释。 gmatch 版本适用于我的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多