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

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

18.04.2021, 14:32. Показов 8066. Ответов 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
5158 / 3482 / 536
Регистрация: 01.06.2013
Сообщений: 7,549
Записей в блоге: 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
5158 / 3482 / 536
Регистрация: 01.06.2013
Сообщений: 7,549
Записей в блоге: 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
5158 / 3482 / 536
Регистрация: 01.06.2013
Сообщений: 7,549
Записей в блоге: 9
18.04.2021, 16:14
Цитата Сообщение от vantfiles Посмотреть сообщение
Ручками экранировать...
Ну, иногда нужно и шаблон применить, и в нём часть символов экранировать.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,708
Записей в блоге: 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
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,708
Записей в блоге: 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
5158 / 3482 / 536
Регистрация: 01.06.2013
Сообщений: 7,549
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru