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"

我不确定为什么它们不起作用,而且我几乎是肯定的,有一个正则表达式。任何帮助将不胜感激。

您不需要替代

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),您正在寻找任何X,其中包括前面OD或后面的所有非白色空间字符。非白空间字符被编码为 %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)

相关内容

最新更新