【问题标题】:Lua - match only words outside {} braces in string and replace or append the words with substringLua - 仅匹配字符串中 {} 大括号之外的单词并用子字符串替换或附加单词
【发布时间】:2019-11-22 09:00:49
【问题描述】:

我有各种形式的字符串,类似于:

这是一个sentence大括号{sentence{},带有一些单词。 {这是一个 sentence 括号内带有一些单词。}{这是第二个 sentence 大括号内。} 此处可能需要多说几句来代表另一个句子

使用 Lua,我只想匹配字符串中“{}”大括号之外的特定单词。例如,我可能想匹配大括号外的单词“sentence”,而不是大括号内出现的“sentence”。我只想匹配单词的粗体出现而不是斜体。

怎么做?


编辑:如果我想追加或替换匹配的单词,同时保持大括号内的子字符串完整,该怎么办?

示例:将“单词”附加到句子:

这是一个sentenceword,在大括号{sentence{} 外带有一些单词。 {这是一个 大括号内的句子和一些单词。}{这是第二句话 在大括号内。} 此处可能需要更多的词来表示另一个 sentenceword

【问题讨论】:

  • 有什么自己的想法吗?尝试?
  • 如果你的牙套是平衡的,那么试试your_text = (your_text.."{}"):gsub("(.-)(%b{})", function(a, b) return a:gsub("sentence", "replacement")..b end):sub(1,-3)
  • @EgorSkriptunoff 为什么你总是在 cmets 中写下你的答案? ;)
  • @DarkWiiPlayer - IMO,简洁的答案是一个很好的答案。但 SO 鼓励长答案。所以,我写 cmets :-)

标签: string lua


【解决方案1】:

执行此操作的最简单方法是将所有括号替换为临时变量中长度为零的字符串,然后您可以使用它来搜索您喜欢的任何内容。

您可以使用 Lua 的模式匹配和以下简单的gsub 代码轻松做到这一点:

local tempStr = startStr:gsub("{.-}","")

.- 是让它抓取{}gsub 之间所有内容的部分,然后将其全部替换为空白字符串。


编辑:上述方法的问题,正如 DarkWiiPlayer 所指出的那样,第一个左大括号与第一个右大括号是不正确的。

解决方法是使用平衡大括号 (%b),正如 DarkWiiPlayer 在他的回答中所推荐的那样,如下所示:

local tempStr = startStr:gsub("%b{}","")

【讨论】:

  • 我能用这个恢复大括号内的原始子字符串吗?我想替换或附加我匹配的大括号外的单词,同时保持大括号内的子字符串完整。
  • 您将有两个变量,一个带有大括号(原始字符串),另一个没有任何大括号(新字符串)。您能否告诉我更多关于您将附加或替换的内容以及一两个示例。最好的方法可能是编辑您的原始问题。
  • "考虑{a string {like} this} one" 在不应该匹配“this”的情况下
  • 我最初有 .*,因为在我意识到它也会忽略两个不同大括号之间的任何合法词之前,它已经与此发生了冲突。所以我把它改成了-,忘了现在上面会发生。哎呀。
【解决方案2】:
local function weird_match(word, str)
   return str:gsub("%b{}", ''):match(word)
end
  • {} 中的balanced pairs 替换为空字符串
  • 在结果字符串中找到所需的模式 (word)
  • 返回匹配的单词(或其捕获,如果有的话)

【讨论】:

    最近更新 更多