Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
 Что-то я не понимаю в Regex. Отрицание вхождения последовательности символов  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145629
Мне нужно получить Да, если некая последовательность символов не входит в проверяемую последовательность.
Вроде есть синтаксис с отрицанием вхождения последовательности.
Вот. Посмотрим. Пишут, что надо использовать отрицательный просмотр
http://qaru.site/questions/44535/regular-expressions-and-negating-a-whole-character-groupstatic
Признак отрицательного просмотра - пара символов ?!
void Main(string[] args)
        {
            string[] test = {"ab", "xy" }; //Тут надо искать
            Regex rYes =  new Regex("(ab)");
            Regex rNo = new Regex("(?!ab)");
            Regex[] reg = { rYes, rNo };
            foreach (string t in test)
            {
                Console.WriteLine($"===={t}===");
                foreach (Regex r in reg)
                {
                    bool b = rYes.IsMatch(t);
                    Console.WriteLine($"{t} имеет {r.ToString()}  как {b}");
                }
            }
            Console.ReadLine();
        }


Выдача

====ab===
ab имеет (ab) как True
ab имеет (?!ab) как True
====xy===
xy имеет (ab) как False
xy имеет (?!ab) как False

Никакой разницы, однако
28 ноя 18, 18:23    [21747762]     Ответить | Цитировать Сообщить модератору
 Re: Что-то я не понимаю в Regex. Отрицание вхождения последовательности символов  [new]
Супер_Пав
Member

Откуда: Москва
Сообщений: 373
bool b = rYes.IsMatch(t);
Маска всегда одна.
28 ноя 18, 18:29    [21747772]     Ответить | Цитировать Сообщить модератору
 Re: Что-то я не понимаю в Regex. Отрицание вхождения последовательности символов  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20436
Cat2
Да, если некая последовательность символов не входит в проверяемую последовательность.
почему бы не инвертировать задачу, чтобы не возиться с просмотром?
!Regex.IsMatch("abcdefg", "^.*cd.*$")
28 ноя 18, 18:32    [21747778]     Ответить | Цитировать Сообщить модератору
 Re: Что-то я не понимаю в Regex. Отрицание вхождения последовательности символов  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145629
Супер_Пав
bool b = rYes.IsMatch(t);
Маска всегда одна.

Прошу прощения, действительно ошибся c показом.

Вот правильный текст
static void Main(string[] args)
        {
            string[] test = {"ab", "xy" };
            Regex rYes =  new Regex("(ab)");
            Regex rNo = new Regex("(?!ab)");
            Regex[] reg = { rYes, rNo };
            foreach (string t in test)
            {
                Console.WriteLine($"===={t}===");
                foreach (Regex r in reg)
                {
                    bool b = r.IsMatch(t);
                    Console.WriteLine($"{t} имеет {r.ToString()}  как {b}");
                }
            }
            Console.ReadLine();
        }

Выдача
====ab===
ab имеет (ab) как True
ab имеет (?!ab) как True
====xy===
xy имеет (ab) как False
xy имеет (?!ab) как True


Все равно у проверяемой строки "ab" нет разницы в выдаче
28 ноя 18, 18:34    [21747782]     Ответить | Цитировать Сообщить модератору
 Re: Что-то я не понимаю в Regex. Отрицание вхождения последовательности символов  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145629
Shocker.Pro
почему бы не инвертировать задачу, чтобы не возиться с просмотром?

Чисто из вредности и перфекционизма. Если сказано, что должно решатся так, то почему я должен изобретать обходные пути?
28 ноя 18, 18:40    [21747789]     Ответить | Цитировать Сообщить модератору
 Re: Что-то я не понимаю в Regex. Отрицание вхождения последовательности символов  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20436
Cat2
Чисто из вредности
Тогда смотри
Regex.IsMatch("cd", "^(?!cd)$")
Выдает False, как ты и хотел.

В то же время
Regex.IsMatch("cd", "(?!cd)")
Выдает True, потому что он находит нулевую последовательность символов, за которой не следует cd - имеет на это право Картинка с другого сайта.

Просмотр вперед и просмотр назад как раз имеет глубокий смысл, когда есть нечто, относительно которого ты смотришь вперед или назад. Но если ты соизволил это нечто объявить как "ничего", то выражение и находит тебе это "ничего", за которым НЕ СЛЕДУЕТ строка "cd". Это видно при рассмотрении Match

К сообщению приложен файл. Размер - 9Kb
28 ноя 18, 22:15    [21747919]     Ответить | Цитировать Сообщить модератору
 Re: Что-то я не понимаю в Regex. Отрицание вхождения последовательности символов  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20436
Напомнило, кстати
Enumerable.Empty<int>().All(n => n == 5)
Все без студии знают результат выражения?
29 ноя 18, 10:46    [21748167]     Ответить | Цитировать Сообщить модератору
 Re: Что-то я не понимаю в Regex. Отрицание вхождения последовательности символов  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Shocker.Pro
Напомнило, кстати
Enumerable.Empty<int>().All(n => n == 5)

Все без студии знают результат выражения?
вот же блин Linq))) Совсем другой стиль программирования),
29 ноя 18, 10:50    [21748173]     Ответить | Цитировать Сообщить модератору
 Re: Что-то я не понимаю в Regex. Отрицание вхождения последовательности символов  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5005
Shocker.Pro
Напомнило, кстати
Enumerable.Empty<int>().All(n => n == 5)
Все без студии знают результат выражения?

И в SQL похожее есть:
;with cte(n) as (
  select v.n from (values(1), (2), (3)) v(n)
)
select *
from cte e
where e.n=all (select e2.n from cte e2)
и
;with cte(n) as (
  select v.n from (values(1), (2), (3)) v(n)
)
select *
from cte e
where e.n=all (select e2.n from cte e2 where 0=1)
29 ноя 18, 11:04    [21748198]     Ответить | Цитировать Сообщить модератору
 Re: Что-то я не понимаю в Regex. Отрицание вхождения последовательности символов  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Сон Веры Павловны,

Это не sql стандарт от 92 года)
29 ноя 18, 11:12    [21748211]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить