Lua 字符串模式:检查字符是否不在单词中

我在 Lua 中想要实现一个字符串模式,即检查给定字符串中某个位置的字符是不是单词的一部分。举个例子,假设我有这个字符串:

str = "exp(x)"

我想要实现的是,找到一个字符串模式,运行以下代码时:

do
    local newStr = str:gsub(STRING-PATTERN, 10)
    print(newStr)
end

它可以正确地输出:

"exp(10)"

而不是:

"e10p(10)"

到目前为止,我尝试了几种字符串模式,但都不起作用。这里是我尝试过的一些例子:

STRING-PATTERN = "[%A[x]%A]?"

"exp(-10"

STRING-PATTERN = "[%A[x]%A*]?"

"e10p1010"

我不太确定为什么这些都不行,但我几乎可以肯定有一个正则表达式可以解决这个问题。感谢任何帮助。

点赞
用户4385647
用户4385647

你不需要替换

string.gsub 是一个用于在字符串中进行替换的函数。这就是为什么你的结果中出现了 10。 另外,你可以将替换内容与查找的内容合并在一起。

print(str:gsub("[%a[x]%a*]?", '<%0>')) --> <exp>(<x>)    2

结果中的 2 表示找到了两个结果。

如果你不熟悉函数返回多个结果的情况,可以参考此链接

你需要使用 string.find 来查找某些内容。这个函数返回查找到的内容的起始位置和结束位置,但是你也可以让它返回一个第三个值:它找到的文本,方法是将你的模式括起来。

print(str:find("[%a[x]%a*]?")) --> 1  2  exp

你的模式不正确

说实话,我不明白你的模式是如何工作的,但是通常不需要在一个搜索字符串中使用方括号。

假设你正在查找字符串 Try exp(x) out 中的 exp(x),你只需要 exp(x),你需要查找前面或后面的任何字符,包括所有非空格字符。非空格字符编码为 %S,并且需要在两侧各有 0 或多个,因此可以使用如下模式:

str = "exp(x)"
print(str:find("(%S*x%S*)")) -->  1    6    exp(x)

str = "Try exp(x) out"
print(str:find("(%S*x%S*)")) -->  5    10    exp(x)

一次性完成所有任务

可以使用内联函数完成所有任务。

newStr = (function(oldStr)
    from, till, found = (oldStr):find("(%S*x%S*)")
    return found
end)(str)

获取有关 lua 模式的更多信息

可以阅读有关 lua 模式的文档,或使用以下代码尝试。

s = "Deadline is 30/05/1999, firm"
date = "%d%d/%d%d/%d%d%d%d"
print(string.sub(s, string.find(s, date)))   --> 30/05/1999
print()

for patrnNr, patrn in pairs{
    "[%a[x]%a]?",
    "[%a[x]%a*]?",
    "([%a[x]%a*]?)",
    "(%a*x%a*)",
    "(.+x.*)",
    "(%S*x%S*)"}
do
    for strNr, str in pairs{
        "Try exp(x) out",
        "Try exp(y) out",
        "Try sin(x) out",
        "Try sin(y) out",
        "Try exp    out",
        "Try x y z  out",
        "Try xy wx out"}
    do
        print(patrn, str, str:gsub(patrn, '<%0>'), str:find(patrn))
    end
end

print()
print(("Try exp(x) out"):gsub("[%a[x]%a*]?", '<%0>')) --> <Try> <exp>(<x>) <out>    4
print(("Try exp(x) out"):find("(%S*x%S*)"))           --> 5    10    exp(x)
2019-06-29 10:39:35