Lua 脚本中的全局正则表达式

Lua 脚本中的全局正则表达式

我的整个文档中有以下 LaTeX 编码,并且想要进行全局转换:

\author{Bronnikov Kirill A{$^{1}$}{$^{2}$}{$^{3}$}}

\author{Santos N O{$^{4}$}{$^{5}$}}

\author{Wang Anzhong{$^{6}$}{$^{7}$}{$^{8}$}}{$^{9}$}}

应该

\author{Kirill A Bronnikov{$^{1}$}, {$^{2}$} and {$^{3}$}}

\author{N O Santos{$^{4}$} and {$^{5}$}}

\author{Anzhong Wang{$^{6}$}, {$^{7}$}, {$^{8}$}} and {$^{9}$}}

我的 Lua 脚本是:

TeXInput=string.gsub(TeXInput,[[{%$%^{(.-)}%$}{%$%^{(.-)}%$}]],[[{$^{%1}$},{$^{%2}$}]])

但是这只是转换单个地方,如何and使用 Lua 添加最终文本?

答案1

您的正则表达式应该是%$}{%$。请注意,美元符号在 Lua 正则表达式中具有特殊含义,用百分号(即转义字符)进行转义。

您必须应用此正则表达式两次:首先,插入逗号,将替换次数限制为模式数减一;其次,插入“and”。

string:gmatch将返回迭代器,可用于计算所需分隔符的数量,并string:gsub进行替换。

local tex = '{$^{1}$}{$^{2}$}{$^{3}$}'

local function commafy (text)
    local pattern = '%$}{%$'
    local count = 0
    for _ in tex:gmatch (pattern) do
        count = count + 1
    end
    return tex:gsub (pattern, '$}, {$', count - 1):gsub (pattern, '$} and {$')
end

print (commafy (tex))

答案2

据我所知,您的示例匹配所有出现的情况,而不仅仅是第一次

测试lua


{$^{1}$}{$^{2}$}{$^{3}$}

{$^{a}$}{$^{b}$}{$^{c}$}

和一个 Lua 文件

local f = io.open("testlua.tex")
local TeXInput = f:read("*a")
f:close()

TeXInput=string.gsub(TeXInput,
[[{%$%^{(.-)}%$}{%$%^{(.-)}%$}{%$%^{(.-)}%$}]],
[[{$^{%1}$},{$^{%2}$} and {$^{%3}$}]])

print(TeXInput)

产生此终端输出

$ texlua dd316.lua

{$^{1}$},{$^{2}$} and {$^{3}$}

{$^{a}$},{$^{b}$} and {$^{c}$}

相关内容