在 Lua 中匹配单词或空格

(对于我的破英语,抱歉)

我想做的是在 Lua 中匹配一个单词(带有或不带有数字和特殊字符)空格字符(空格,制表符,可选换行)。 例如:

local my_string = “foo bar”
my_string:match(regex)    --> 应该返回 'foo'' ''bar' 

my_string = “   123!@.”     -- 注意:'123!@.' 之前有三个空格
my_string:match(regex)    --> 应该返回 ' '' '' ''123!@.'

其中 regex 是我要求的 Lua 正则表达式模式。 当然,我已经在 Google 上做了一些研究,但是我找不到有用的信息。到目前为止,我得到的是 [% s%S] +[% s +%S],但似乎无法工作。

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

点赞
用户4687565
用户4687565

Match 函数返回匹配到的子串或者整个匹配的字符串,你的模式没有定义它们。 [%s%S]+ 匹配 "(空格或非空格) 重复出现多次以上", 也就是说,它可以匹配所有字符。 [%s+%S+] 是错的,字符类 [ ] 包含的是单个字符成员,它不会以任何其他方式处理字符序列(例如,"[cat]" 匹配 "c""a"),也不关心 +[%s+%S+] 可能是 "(一个空格或加号或非空格或加号) 单个字符" 的意思。

第一个示例 '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 库。

2017-05-21 23:16:01