Lua String Pattern Проверка, нет ли символа в слове - PullRequest
2 голосов
/ 29 июня 2019

Итак, я пытаюсь достичь в 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 Ответ

1 голос
/ 29 июня 2019

Вам не нужна замена

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, включая все непробельные символы перед ним или за ним. Не пробельные символы кодируются как %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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...