:gsub не работает должным образом в сценарии lua

Я пишу сценарий 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

Можно сказать, что все, что мне нужно, это второе слово строки с ровно одним пробелом между первым и вторым словом. Для всего остального мне нужен нулевой вывод.

В чем разница между методом "==" и equals()
В чем разница между методом "==" и equals()
Это один из наиболее часто задаваемых вопросов новичкам на собеседовании. Давайте обсудим его на примере.
Замена символа по определенному индексу в JavaScript
Замена символа по определенному индексу в JavaScript
В JavaScript существует несколько способов заменить символ в строке по определенному индексу.
0
0
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Frid-j 13.05.2023 12:40

Другие вопросы по теме