Я пишу сценарий lua и хочу выполнить операцию вроде:
input_string = "smart app"
output_string = "app"
input_string = "smart" or input_string = "smart "
output_string = nil (null)
Я использую приведенный ниже фрагмент lua, чтобы заменить «умный» пустой строкой, чтобы решить оба случая.
output_string = input_string:gsub("smart ", "")
Однако я получаю ниже ответы для каждого случая соответственно.
input_string = "smart app"
output_string = "app"
input_string = "smart" or imput_string = "smart "
output_string = "smart"
Почему это не работает для случая 2? Где я делаю ошибку? Пожалуйста, предложите.
P.S. Я не хочу писать отдельную логику для обработки обоих случаев, в идеале мой фрагмент должен решать случай в одной строке.
ОБНОВЛЕНИЕ ВОПРОС:
в случае
input_string = "смр" или "смр"
Я имею в виду любое другое слово, тогда также я ожидаю output_string = nil
Можно сказать, что все, что мне нужно, это второе слово строки с ровно одним пробелом между первым и вторым словом. Для всего остального мне нужен нулевой вывод.


input_string = "smart" or input_string = "smart ",output_string = nil (null)
Это невозможно, используя только gsub. gsub всегда будет создавать строку. Если вы хотите, чтобы пустая строка "" была преобразована в nil, вам придется написать дополнительную логику: if output_string == "" then output_string = nil end
input_string = "smart"ошибочно преобразовано вoutput_string = "smart"
Ваш шаблон содержит завершающий пробел. Чтобы он соответствовал, ваш ввод должен содержать smart, за которым следует пробел. Просто smart не заканчивается пробелом.
Сделайте пробел необязательным: smart ? будет жадно пытаться сопоставить пробел, но также не примет пробел. Предупреждение: это также преобразует smartass в ass.
Сопоставление конца строки или пробела, как было бы возможно в RegEx с использованием ( |$), невозможно с шаблонами, поскольку чередование (|) не поддерживается.
Кроме того, вы можете использовать дополнительную логику, просто явно обрабатывая "smart": if input_string == "smart" then output_string = "" end. Это будет правильно работать с smartass, сохраняя его нетронутым.
Обратите внимание, что вам может понадобиться %s вместо буквального пробела, чтобы принять другие интервалы, такие как табуляции. Вы также, вероятно, захотите, чтобы квантификатор, такой как *, принимал несколько пробелов. Я бы также добавил якорь ^ в начало шаблона, чтобы нигде в строке не заменять smart.
В общем, рекомендую output_string = input_string:gsub("^smart%s*", "")
Что касается вашего обновления:
input_string = "smr" or "smr "Я имею в виду любое другое слово, тогда я также ожидаю output_string = nil Можно сказать, что все, что мне нужно, это второе слово строки с ровно одним пробелом между первым и вторым словом. Для всего остального мне нужен нулевой вывод.
В таком случае вам точно нужен output_string = input_string:match("^smart (.+)").
Объяснение: предполагается, что ваша строка начинается с smart , а затем жадно захватывает оставшиеся символы до конца. Если вы хотите поддерживать пустое слово, если строка представляет собой просто "smart ", используйте .* вместо .+.
Если строка не начинается с smart , это не совпадет, и результатом будет nil.
пожалуйста, проверьте вопрос об обновлении один раз @Luatic