С# Regex - соответствует только если существует подстрока?

53
3

Хорошо, поэтому я думаю, что у меня есть дескриптор отрицания - теперь только о выборе соответствия, в котором есть указанная подстрока?

Данный:

This is a random bit of information from 0 to 1.
This is a non-random bit of information I do NOT want to match
This is the end of this bit

This is a random bit of information from 0 to 1.
This is a random bit of information I do want to match
This is the end of this bit

И попытка следующего регулярного выражения:

/(?s)This is a random bit(?:(?=This is a random).)*?This is the end/g

Почему это не работает? Что мне не хватает?

Я использую regexstorm.com для тестирования...

спросил(а) 2016-05-02T00:12:00+03:00 4 года, 1 месяц назад
1
Решение
66

Вы испортили умеренный жадный токен, превратив негативный взгляд в позитивный. Это не сработает, потому что положительный lookahead требует равенства текста. This is a random в каждой позиции после того, This is a random bit.

Тебе нужно:

    Сопоставьте ведущий разделитель (This is a random bit) Сопоставьте весь текст 0+, который не является разделителем-листом/закрытием, а не требуемым случайным текстом внутри этого блока Сопоставьте конкретную строку внутри (This is a random) Сопоставьте все 0+ текст, который не является разделителем верхнего и нижнего пределов Совместите ограничитель закрытия (This is the end)

Итак, используйте

(?s)This is a random bit(?:(?!This is a random bit|This is the end|This is a random).)*This is a random(?:(?!This is a random bit|This is the end).)*This is the end

См. Демо-версию regex

    (?s) - режим DOTALL на (. совпадает с символом новой строки) This is a random bit - ведущий разделитель (?: # Start of the tempered greedy token (?!This is a random bit # Leading delimiter | This is the end # Trailing delimiter | This is a random) # Sepcific string inside. # Any character )* # End of tempered greedy token This is a random подстрока (?:(?!This is a random bit|This is the end).)* - Еще один умеренный алчный токен, соответствующий любому тексту, не (?:(?!This is a random bit|This is the end).)* лидирующих/закрывающих разделителей, до первого... This is the end разделитель

ответил(а) 2016-05-02T00:22:00+03:00 4 года, 1 месяц назад
38

Надеюсь, вы это понимаете (?:(?=This is a random).) Может совпадать только один раз, а не дважды, если бы оно было количественно. Например, Th может удовлетворить взгляд. Когда T потребляется, следующий символ - h который никогда не удовлетворит lookhhead Th. Следующее выражение оценивается, чтобы никогда больше не возвращаться к lookahead. Вместо этого используйте отрицательный lookahead.

ответил(а) 2016-05-02T02:24:00+03:00 4 года, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема