Регулярное выражение для сопоставления нескольких строк в любом месте строки - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь добавить проверку в ASP. NET с помощью Regex. По сути, мне нужно убедиться, что текстовое поле содержит как *** ThisString ***, так и *** ThatString ***, включая звездочки.

Я могу заставить его работать с одним или с одним, или с другим, просто они не присутствуют одновременно и в любой части строки. Это проверка.

Спасибо

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

Как правильно указал нангидрин, мое решение не будет работать, если есть несколько строк, но нет другой. Если это может произойти, вы можете проверить каждую строку отдельно для удобства чтения

  • Первое регулярное выражение - (?:\*{3}ThisString\*{3})

  • Второе регулярное выражение - (?:\*{3}ThatString\*{3})

Если совпадения найдены в обоих случаях, вы можете go!

Оригинальный ответ: -

This нужное регулярное выражение: (?:\*{3}(?:ThisString|ThatString)\*{3})

Примечание : Убедитесь, что включено глобальное совпадение, и убедитесь, что звездочки правильно экранированы.

Если вышеприведенное выражение находит 2 (или больше) совпадений, это значит, что вы хорошо справляетесь с go.

Объяснение: -

  • Все это в не захватывающей группе, это убедитесь, что все внутри соответствует полностью
  • С каждой стороны строк по 3 звезды, с 3 звездами на одной стороне, но не на другой, не приведет к совпадению
  • И ThisString, и ThatString находятся в сгруппированной альтернативе, это для уменьшения беспорядка, вы можете полностью заклинить каждую ssible позиционный паттерн, но это лучше, так как позиция здесь не имеет значения. ***ThatString*** может предшествовать ***ThisString*** или наоборот.

УБЕДИТЕСЬ чтобы проверить длину найденных совпадений, длина должна быть 2, чтобы ваше описанное условие было доволен.

Вот демо live

0 голосов
/ 27 февраля 2020

Используя ответ @ Chase, я смог придумать следующее:

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
    Regex thisString = new Regex("(?:\*{3}ThisString\*{3})");
    Regex thatString = new Regex("(?:\*{3}ThatString\*{3})");

    if (!thisString.IsMatch(value.ToString()) || !thatString.IsMatch(value.ToString()))
    {
        return new ValidationResult("***ThisString*** and ***ThatString*** are used to generate the email text. Please ensure the text above has both ***ThisString*** and ***ThatString*** somewhere within the text.");        }

    return  ValidationResult.Success;
}

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

...