【问题标题】:Lua String Pattern Checking if a Character is Not in a WordLua字符串模式检查字符是否不在单词中
【发布时间】:2019-07-02 05:23:04
【问题描述】:

所以我试图在 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"

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

【问题讨论】:

  • 你可能需要编写一个解析器来做你想做的事情。
  • 请提供字符串列表和所需结果。还包括您不想找到任何内容的示例。

标签: regex lua


【解决方案1】:

你不需要替换

string.gsub 是一个替换字符串中某些内容的函数。这就是为什么10 出现在您的结果中的原因。 顺便说一句,你用一个litteral替换你找到的东西,但你也可以在替换中包含你找到的东西。

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-16
    • 2014-01-25
    • 1970-01-01
    • 2017-02-28
    • 1970-01-01
    • 2017-01-20
    • 2016-02-26
    • 1970-01-01
    相关资源
    最近更新 更多