如何在 lua 正则表达式中匹配此模式,以便它可以捕获字符串中的内容

How to match this pattern in lua regex so it can catch what's inside the string

我试图在用下划线括起的单词之间放置两个星号。

到目前为止,我成功匹配了下划线内只有一个单词的模式,如果中间有一个space,则模式失败。

如何编写正确的模式来找到下划线之间的单词并在它们之间加上星号?这是我的代码的 MWE:

function string:add(start, fim, word)
    return self:sub(1,start-1) .. "**" .. word .. "**" .. self:sub(fim+1)
end

regex = "In this string I'm putting _many_ words to test if I _wrote_ the code right to _match patterns_."

while regex:find("_(%w+)_") ~= nil do
    start, fim = regex:find("_(%w+)_")
    regex = regex:add(start, fim, regex:match("_(%w+)_"))
end

print(regex)

输出为:

In this string I'm putting **many** words to test if I **wrote** the code right to _match patterns_.

可以看出,在_match patterns_中有两个词和一个space,所以我的模式_(%w+)_跳过了它。我如何也包含它?

您可以使用 [] 创建一个集合并定义该集合以允许字母数字字符和空格:

regex:find("_([%w%s]+)_")

这是一个资源,您可以在其中了解有关 lua 模式的更多信息:

FHUG: Understanding Lua Patterns

可以简单的找到下划线之间不包括space开头的字符:

local str = "In this string I'm putting _many_ words to test if I _wrote_ the code right to _match patterns_."

print(str:gsub("_([^%s].-)_","**%1**"))

-- find the words --
for words in str:gmatch("_([^%s].-)_") do
  print(words)
end