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

时间:2019-06-29 06:13:31

标签: regex 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"

我不确定这些为什么不起作用,我几乎肯定有一个正则表达式。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您不需要替代品

string.gsub是用于替换字符串中某些内容的函数。这就是在您的结果中出现10的原因。 顺便说一句,您可以用乱扔垃圾代替发现的东西,但是也可以包含在替换物中发现的东西。

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

2表示找到了两个结果。

如果您不熟悉返回多个结果的函数,请read this

您需要string.find才能找到东西。此函数返回找到的内容的开始和结束位置,但是您也可以通过将模式括在方括号中,使它返回第三个值:找到的文本。

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

您的模式是错误的。

说实话,我不了解您的模式是如何工作的,但是搜索字符串中通常不需要方括号。

假设您正在寻找Try exp(x) out中的字符串,则只需要exp(x),您正在寻找任何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模式的更多信息

read about patterns in 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)