регулярное выражение без учета регистра символов

progrlab

Client
Регистрация
07.02.2014
Сообщения
204
Благодарностей
82
Баллы
28
Есть текст из которого я хочу убрать (заменить) список слов.
В тексте эти слова могут быть в различном регистре.
Пробую вот такой регукляркой. Не получается.
(слово 1|слово 2| слово3)/i

Как можно было бы решить данную проблему ?
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 707
Баллы
113
(?i)(слово 1|слово 2| слово3)
 

progrlab

Client
Регистрация
07.02.2014
Сообщения
204
Благодарностей
82
Баллы
28
Спасибо за подсказку. Но при использовании данного регулярного выражения в экшене "Обработка текста - заменить".

Из следующего исходного текста :
"Давайте будем"

Получилось вот такое :
"*****Д*****а*****в*****а*****й*****т*****е***** *****б*****у*****д*****е*****м***** "

Что искать : (?i)(слово1| слово2| слово3)
На что заменить : *****
Включен радиобаттон - Regex
Что заменять : все.
Причем ни слово1, ни слово2, ни слово3 - в тексте не было.
Где я прокололся ?
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 707
Баллы
113
Где-то ошиблись.
Прикладывайте семпл (шаблон из одного экшена демонстрирующий проблему) , а не текстовое описание проблемы.
 

progrlab

Client
Регистрация
07.02.2014
Сообщения
204
Благодарностей
82
Баллы
28
Ок. скину сэмпл. Приготовлю и скину.

Пока проблему решил вот таким куском кода :

Код:
// инициализация переменной
var result = " ";
// получаем список, в котором ключевые слова
var sourceList = project.Lists["censor_list"];
// подстрока для замены
var rstr = "***";
// берем из переменной текст, который надо заменить
var tmpStr = project.Variables["message1"].Value.ToLower();

// ищем строки из списка в тексте
lock(SyncObjects.ListSyncer)
{
    for(int i=0; i < sourceList.Count; i++)
    {
        // читаем строку из списка
        var str = sourceList[i];
        // замещаем все всхождения в строке
        result = tmpStr.Replace(str,rstr);
        tmpStr = result;
    }
}
// возвращаем результат
return result;
Он почти устраивает. Если бы не вот эта строка.
Весь исходный текст к нижнему регистру приводится :(
Код:
// берем из переменной текст, который надо заменить
var tmpStr = project.Variables["message1"].Value.ToLower();
 
Последнее редактирование:

iDnx

Client
Регистрация
06.06.2013
Сообщения
129
Благодарностей
104
Баллы
43
Нужно убрать метод ToLower.
Код:
// берем из переменной текст, который надо заменить
var tmpStr = project.Variables["message1"].Value;
 

progrlab

Client
Регистрация
07.02.2014
Сообщения
204
Благодарностей
82
Баллы
28
Нужно убрать метод ToLower.
Код:
// берем из переменной текст, который надо заменить
var tmpStr = project.Variables["message1"].Value;
Тогда я не смогу вычистить те слова, которые в другомрегистре.
Пример :
Список плохих слов : bad, verybad, very-bad
Текст : Bad, bla-bla-bla ! verybad .
В итоге :
verybad - уберется, а Bad - нет.
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 707
Баллы
113
Семпл кидайте нерабочий со стандартным экшеном. Давайте там ошибку найдем.
 

progrlab

Client
Регистрация
07.02.2014
Сообщения
204
Благодарностей
82
Баллы
28
Семпл кидайте нерабочий со стандартным экшеном. Давайте там ошибку найдем.
Спасибо. Я разобрался с нерабочим "стандартным экшеном". Попутно понял, что такой вариант мне не подходит.
И более подходит вариант с вышепреведенным куском кода на C# . Т.к. в этом случае я могу более гибко управлять списком плохих слов.
Осталось только решить проблему с приведением к регистру не всего текста. А его части.
Да и еще попутно нарыл моЩЩную регулярку. Такого монстра я еще не встречал. Она фильтрует нецензурные слова. Правда похоже только для однострочного варианта.

Вот она :

/\w{0,5}[хx]([хx\s\!@#\$%\^&*+-\|\/]{0,6})[уy]([уy\s\!@#\$%\^&*+-\|\/]{0,6})[ёiлeеюийя]\w{0,7}|\w{0,6}[пp]([пp\s\!@#\$%\^&*+-\|\/]{0,6})[iие]([iие\s\!@#\$%\^&*+-\|\/]{0,6})[3зс]([3зс\s\!@#\$%\^&*+-\|\/]{0,6})[дd]\w{0,10}|[сcs][уy]([уy\!@#\$%\^&*+-\|\/]{0,6})[4чkк]\w{1,3}|\w{0,4}[bб]([bб\s\!@#\$%\^&*+-\|\/]{0,6})[lл]([lл\s\!@#\$%\^&*+-\|\/]{0,6})[yя]\w{0,10}|\w{0,8}[её][bб][лске@eыиаa][наи@йвл]\w{0,8}|\w{0,4}[еe]([еe\s\!@#\$%\^&*+-\|\/]{0,6})[бb]([бb\s\!@#\$%\^&*+-\|\/]{0,6})[uу]([uу\s\!@#\$%\^&*+-\|\/]{0,6})[н4ч]\w{0,4}|\w{0,4}[еeё]([еeё\s\!@#\$%\^&*+-\|\/]{0,6})[бb]([бb\s\!@#\$%\^&*+-\|\/]{0,6})[нn]([нn\s\!@#\$%\^&*+-\|\/]{0,6})[уy]\w{0,4}|\w{0,4}[еe]([еe\s\!@#\$%\^&*+-\|\/]{0,6})[бb]([бb\s\!@#\$%\^&*+-\|\/]{0,6})[оoаa@]([оoаa@\s\!@#\$%\^&*+-\|\/]{0,6})[тnнt]\w{0,4}|\w{0,10}[ё]([ё\!@#\$%\^&*+-\|\/]{0,6})[б]\w{0,6}|\w{0,4}[pп]([pп\s\!@#\$%\^&*+-\|\/]{0,6})[иeеi]([иeеi\s\!@#\$%\^&*+-\|\/]{0,6})[дd]([дd\s\!@#\$%\^&*+-\|\/]{0,6})[oоаa@еeиi]([oоаa@еeиi\s\!@#\$%\^&*+-\|\/]{0,6})[рr]\w{0,12}/i
 
Последнее редактирование:

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 707
Баллы
113
Что то странная. И что конкретно она должна отфильтровать?
 

progrlab

Client
Регистрация
07.02.2014
Сообщения
204
Благодарностей
82
Баллы
28

iDnx

Client
Регистрация
06.06.2013
Сообщения
129
Благодарностей
104
Баллы
43
Код:
// получаем список, в котором ключевые слова
var sourceList = project.Lists["censor_list"];
// берем из переменной текст, который надо заменить
var tmpStr = project.Variables["message1"].Value;
// подстрока для замены
var rstr = "***";

// ищем строки из списка в тексте
lock(SyncObjects.ListSyncer)
{
    for(int i=0; i < sourceList.Count; i++)
    {
        // Regex.Replace
        var regex = new System.Text.RegularExpressions.Regex(@sourceList[i], System.Text.RegularExpressions.RegexOptions.IgnoreCase);
        tmpStr = regex.Replace(tmpStr, rstr);
    }
}
// возвращаем результат
return tmpStr;
В список можно кидать регулярки.
 
  • Спасибо
Реакции: progrlab

progrlab

Client
Регистрация
07.02.2014
Сообщения
204
Благодарностей
82
Баллы
28
В список можно кидать регулярки.
Спасибо за подсказку !
Я немного изменил ваш исходник и все заработало.
Изменения связаны с тем, что в редактируемом тексте может быть несколько вхождения стоп-слов. Надо заменить все.
Поэтому потребовалось сохранение промежуточного результата во временной переменной.
Теперь в тексте можно заменять слова, перечисленные в списке censor_list.
Код:
// получаем список, в котором ключевые слова
var sourceList = project.Lists["censor_list"];
// берем из переменной текст, который надо заменить
var tmpStr = project.Variables["message1"].Value;
// подстрока для замены
var rstr = "***";
// инициализируем строку
var resStr = "";

// ищем строки из списка в тексте
lock(SyncObjects.ListSyncer)
{
    for(int i=0; i < sourceList.Count; i++)
    {
        // Regex.Replace
        var regex = new System.Text.RegularExpressions.Regex(@sourceList[i],
            System.Text.RegularExpressions.RegexOptions.IgnoreCase);
        resStr = regex.Replace(tmpStr, rstr);
        tmpStr = resStr;
    }
}
// возвращаем результат
return resStr;
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)