С Новым годом! Форум программистов, компьютерный форум, киберфорум
Lua
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/35: Рейтинг темы: голосов - 35, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 21.11.2020
Сообщений: 5

Как найти и заменить подстроку - как есть, без регулярных выражений

18.04.2021, 14:32. Показов 7970. Ответов 14
Метки lua (Все метки)

Студворк — интернет-сервис помощи студентам
Как найти и заменить подстроку - как есть, без регулярных выражений?
Уже неделю копаю, но ничего толкового не накопал... Прошу помощи.

Например, есть строка:
.%_??\/||{-___&&*[] или любая подобная, в которой присутствуют символы, которые языком Lua при поиске - воспринимаются, как регулярное выражение. Как отключить регулярные выражения при поиске? Как мне её найти "как есть" - без регулярных выражений?

Lua
1
2
local s = "Какой-то текст, какой-то текст,     .%_??\/||{-___&&*[]    какой-то текст. "
string.gsub( s, ".%_??\/||{-___&&*[]", "заменить на то что мне надо", 1 )
или в строке есть три точки ... , для того чтобы их найти, мне надо писать так: %.%.%. , но как сделать так, чтобы я мог просто искать как есть, без регулярок, т.е. чтобы я мог написать вот так и оно работало и находило и заменяло?

Lua
1
2
local s = "Какой-то текст, какой-то текст,     ...    какой-то текст. "
string.gsub( s, "...", "нашло три точки без регулярок как есть и заменило на то что мне надо", 1 )
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.04.2021, 14:32
Ответы с готовыми решениями:

Как с помощью регулярных выражений заменить все повторения заданной подстроки на один символ
Разбираюсь с этой темой. Про метасимволы и т.д. уже почитала, но хочется прочесть о стандартных (канонических) задачах и решениях. Нигде не...

Как с помощью регулярных выражений определить что в тексте есть нужный город из словаря
Добрый день, есть файл со списком городов: Москва, Омск, Ростов на дону, и т.д. есть исходная строка, например: ...

Без применения регулярных выражений
Нужна срочно помощь.Задание сделала,но преподователю не понравилось с формулировкой:-"Этого не было в нашей образовательной...

14
 Аватар для vantfiles
1018 / 1914 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
18.04.2021, 15:06
string.find( s, pattern [ ,start_pos [ ,bool_plain ] ] )

Ищет первое вхождение шаблона pattern в строку s
В случае ошибки возвращает nil
По умолчанию start_pos = 1
Если bool_plain=true, то регулярные выражения отключаются
RTFM
0
Модератор
 Аватар для Curry
5153 / 3465 / 536
Регистрация: 01.06.2013
Сообщений: 7,528
Записей в блоге: 9
18.04.2021, 15:19
Или как vantfiles написал, или
Lua
1
2
local  s = "Например, есть строка:.%_??\\/||{-___&&*[] или любая подобная" 
print(string.find(s,"%.%%_%?%?\\/||{%-___&&%*%[%]"))  -- экранируем ( ) . % + - * ? [ ] ^ $ символом % и дублируем \
\ дублировать в любом случае.
0
 Аватар для vantfiles
1018 / 1914 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
18.04.2021, 15:30
Лучший ответ Сообщение было отмечено ptvz-79 как решение

Решение

Или можно так:

Lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
local tab = {
  ["("] = "%(",
  [")"] = "%)",
  ["."] = "%.",
  ["%"] = "%%",
  ["+"] = "%+",
  ["-"] = "%-",
  ["*"] = "%*",
  ["?"] = "%?",
  ["["] = "%[",
  ["]"] = "%]",
  ["^"] = "%^",
  ["$"] = "%$",
}
 
 
local s = "Какой-то текст, какой-то текст,     ...    какой-то текст. "
local shablon = "..."
s = string.gsub( s, string.gsub( shablon, ".", tab ), "нашло три точки без регулярок как есть и заменило на то что мне надо", 1 )
 
print( s )
0
0 / 0 / 0
Регистрация: 21.11.2020
Сообщений: 5
18.04.2021, 15:32  [ТС]
Хорошо, с поиском строки "как есть" без регулярок - понятно, вот я нашёл строку:

Lua
1
2
3
  local s = "Какой-то текст, какой-то текст,     .%_??\/||{-___&&*[]    какой-то текст. "
  local pos_1, pos_2, err_1, err_2 = string.find( s, ".%_??\/||{-___&&*[]", 1, true )
  print( "--- pos_1="..tostring(pos_1)..", pos_2="..tostring(pos_2)..", err_1="..tostring(err_1)..", err_2="..tostring(err_2) )
Результат:
Lua
1
--- pos_1=37, pos_2=54, err_1=nil, err_2=nil
Как теперь мне заменить то что я нашёл? Ведь string.find - возвращает позицию начала и конца найденного?
0
 Аватар для vantfiles
1018 / 1914 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
18.04.2021, 15:35
Curry, что-то у Вас как-то не так...
0
Модератор
 Аватар для Curry
5153 / 3465 / 536
Регистрация: 01.06.2013
Сообщений: 7,528
Записей в блоге: 9
18.04.2021, 15:38
Цитата Сообщение от vantfiles Посмотреть сообщение
что-то у Вас как-то не так...
Что?
0
 Аватар для vantfiles
1018 / 1914 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
18.04.2021, 15:49
Лучший ответ Сообщение было отмечено ptvz-79 как решение

Решение

Через find как-то так:

Lua
1
2
3
4
5
6
7
8
9
10
11
local s = "Какой-то текст, какой-то текст,     ...    какой-то текст. "
local sh = "..."
local zam = "нашло три точки без регулярок как есть и заменило на то что мне надо"
 
local b,e = string.find( s, sh, 1, true )
 
if b then
   s = s:sub( 1, b-1 ) .. zam .. s:sub( e+1, -1 )
end
 
print( s )
Цитата Сообщение от Curry Посмотреть сообщение
Что?
Ручками экранировать...
0
0 / 0 / 0
Регистрация: 21.11.2020
Сообщений: 5
18.04.2021, 15:59  [ТС]
Всем огромное спасибо! Очень помогли! Второе решение от vantfiles - работает отлично, только я не понял - как? Но, это уже мои проблемы. Ушёл разбираться и курить код.

P.S. Я так понимаю, только что был написан "костыль" функции, которой в LUA - нет, а именно: поиск подстроки "как есть" и её замена.

Вопрос решён.
0
Модератор
 Аватар для Curry
5153 / 3465 / 536
Регистрация: 01.06.2013
Сообщений: 7,528
Записей в блоге: 9
18.04.2021, 16:14
Цитата Сообщение от vantfiles Посмотреть сообщение
Ручками экранировать...
Ну, иногда нужно и шаблон применить, и в нём часть символов экранировать.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 14
18.04.2021, 20:00
А просто перебором символов строки Lua не допускает? Странно...
0
0 / 0 / 0
Регистрация: 21.11.2020
Сообщений: 5
18.04.2021, 20:15  [ТС]
Цитата Сообщение от Catstail Посмотреть сообщение
А просто перебором символов строки Lua не допускает? Странно...
Что вы имеете в виду? Я бы забрал все возможные варианты, чтобы не плодить темы по этому поводу. Можно пример того о чём вы написали?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 14
18.04.2021, 20:37
ptvz-79, видите ли... Я совсем не знаю Lua. Не знаю его идеологии. Но в других языках есть стандартный набор для действий со строками. Он включает следующие функции:

- взять подстроку заданной строки с позиции i длины n
- сравнить две строки на равенство
- конкатенация строк

Этих базовых операций вполне достаточно, чтобы реализовать любые действия со строками. К примеру, вот самодельная find в C++:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <string>
 
using namespace std;
 
int find(string where, string what)
{
    int i=0,iw=what.size(),zw=where.size();
    
    while(1)
    {
        if (where.substr(i,iw)==what) return i;
        i++;
        if (i+iw>=zw) return -1;
    }
}
 
int main()
{
    cout << find(string("abrakadabra"),string("kad")) << endl;
 
    return 0;
}
1
Модератор
 Аватар для Curry
5153 / 3465 / 536
Регистрация: 01.06.2013
Сообщений: 7,528
Записей в блоге: 9
18.04.2021, 20:59
Цитата Сообщение от Catstail Посмотреть сообщение
- взять подстроку заданной строки с позиции i длины n
- сравнить две строки на равенство
- конкатенация строк
Lua
1
2
3
4
5
6
local  s = "qwerty"
print(s:sub(3,5)) -- ert
if s == "qwerty" then
  print("equivalence") 
end  
print(s .. "+" .. s) -- qwerty+qwerty
Цитата Сообщение от Catstail Посмотреть сообщение
Этих базовых операций вполне достаточно, чтобы реализовать любые действия со строками. К примеру, вот самодельная find
Есть в lua find. См. выше. Только по умолчанию оно ищет по регулярному выражению, но это отключается.
1
0 / 0 / 0
Регистрация: 21.11.2020
Сообщений: 5
18.04.2021, 21:08  [ТС]
Catstail, а, теперь, понял, это есть, да. И в этой теме выше как раз мне давали такой пример тут
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.04.2021, 21:08
Помогаю со студенческими работами здесь

Grep без регулярных выражений
пытаюсь написать аналог grep из Linux, имеется вот такой код: static void Main(string args) { string text =...

Есть ли в С# встроеные библиотеки регулярных выражений?
Есть ли в С# встроеные библиотеки регулярных выражений?

Есть ли аннотация для регулярных выражений ?
Вот такие выражения, вызывают массу предупреждений в Intelliji Idea. Есть ли способ как то пометить их соответствующей аннотацией,...

Заменить слова и символы путем регулярных выражений
Здравствуйте! Есть такая строка: &lt;?php $str = 'My Webpage'; ?&gt; С помощью функции preg_match_all проверить есть ли строке...

Разборка URL. без регулярных выражений
Необходимо разобрать URL. Используя только строчные функции PHP, а также функции работы с массивами. Регулярными выражениями пользоваться...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru