Регулярка "не содержит"

blamingas

Client
Регистрация
14.05.2021
Сообщения
114
Благодарностей
45
Баллы
28
Есть переменные со значениями
2-15555
3-12222
33333
12222
В зависимости от типа значения идет дальнейшая работа с ним.
Пытаюсь через Обработка текста - Regex регуляркой проверить, чтобы в работу было взято только 12222. Т.е. в регулярке должно быть указано СОДЕРЖИТ 1**** и НЕ СОДЕРЖИТ префиксы \d-, одновременно. Как "содержит" - понятно - 1\d{4}, как "не содержит" тоже (через [^******] ). Но как так сделать, чтобы оба этих условия вместе одновременно дружили придумать не получается.

Можно конечно при столкновении с переменной каждый раз класть ее в список и там "Взять значение не содержащее Regex" и делать последовательную проверку, но это как-то сильно костыльно выходит.
Возможно есть более элегантное решение?
 
Последнее редактирование:

bizzon

Client
Регистрация
08.09.2015
Сообщения
1 103
Благодарностей
132
Баллы
63
Для исключения последовательности символов из поиска перед ней ставится символ ^, например:
[^аbcd] (или [^а-d] ) - соответствует любому символу, кроме a,b,c,d Обратите внимание, что символ ^ находится внутри квадратных скобок, так как только в этом случае он имеет значение не.
 
  • Спасибо
Реакции: blamingas и Roman48

Oleg-KC

Client
Регистрация
17.02.2020
Сообщения
169
Благодарностей
56
Баллы
28
Могу предложить решение на C# которое удалит из вашего списка с переменными все значения которые: начинаются с \d- и не содержат: 1\d{4}
т.е. в списке останутся строки по вашим условиям.
СОДЕРЖИТ 1**** и НЕ СОДЕРЖИТ префиксы \d-, одновременно.
C#:
var list = project.Lists["ЗдесьИмяВашегоСписка"];
// в цикле прогоним каждую строку по вашим условиям
for(int i=0; i<list.Count; i++){
    var str = project.ExecuteMacro(list[i]);
    var reg = Macros.TextProcessing.Regex(str, @"\d-.*", "0"); // regex \d-
    // если по regex ничего не нашлось проверяем на другой
    if(reg.Count == 0){
        var reg2 = Macros.TextProcessing.Regex(str, @"1\d{4}", "0"); // regex 1\d{4}
        // если ничего не нашлось удаляем строку
        if(reg2.Count == 0){
            list.RemoveAt(i);
            i--;
        }
        // если нашлось оставляем
        else{
            return "ok";
        }
    }
    // если нашлось по первому regex тоже удаляем строку
    else{
        list.RemoveAt(i);
        i--;
    }
}
Если будете использовать в многопотоке, нужно залочить конструкцию
 
  • Спасибо
Реакции: blamingas

blamingas

Client
Регистрация
14.05.2021
Сообщения
114
Благодарностей
45
Баллы
28
Могу предложить решение на C# которое удалит из вашего списка с переменными все значения которые: начинаются с \d- и не содержат: 1\d{4}
т.е. в списке останутся строки по вашим условиям.


C#:
var list = project.Lists["ЗдесьИмяВашегоСписка"];
// в цикле прогоним каждую строку по вашим условиям
for(int i=0; i<list.Count; i++){
    var str = project.ExecuteMacro(list[i]);
    var reg = Macros.TextProcessing.Regex(str, @"\d-.*", "0"); // regex \d-
    // если по regex ничего не нашлось проверяем на другой
    if(reg.Count == 0){
        var reg2 = Macros.TextProcessing.Regex(str, @"1\d{4}", "0"); // regex 1\d{4}
        // если ничего не нашлось удаляем строку
        if(reg2.Count == 0){
            list.RemoveAt(i);
            i--;
        }
        // если нашлось оставляем
        else{
            return "ok";
        }
    }
    // если нашлось по первому regex тоже удаляем строку
    else{
        list.RemoveAt(i);
        i--;
    }
}
Если будете использовать в многопотоке, нужно залочить конструкцию
Спасибо большое. То что нужно!)
 
  • Спасибо
Реакции: Oleg-KC

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