Сопоставьте определенное выражение в нескольких строках с помощью RegularExpressionValidator

#asp.net #.net #regex

#asp.net #.net #регулярное выражение

Вопрос:

Я пытаюсь создать регулярное выражение, соответствующее тексту, введенному пользователем при многострочном вводе

Текст должен быть в этой форме:

 Class 1: Exemple1 
Class 2: Exemple2
....
  

Каждая строка должна соответствовать этому синтаксису.

Мне удалось создать регулярное выражение для одной строки, но я не могу найти подходящее решение для расширения его до многострочной версии

 <asp:RegularExpressionValidator ID="RegularExpressionValidator" runat="server"
 ErrorMessage="This is wrong!" ValidationExpression="^[Class] s[0-9] : s [a-zA-Z] $"
ControlToValidate="txtUserInput"></asp:RegularExpressionValidator><br />
  

Заранее благодарю вас за вашу помощь

Комментарии:

1. Но это будет работать только для 2 строк, верно? количество строк неизвестно

2. Вы можете использовать AClasss[0-9] :s [a-zA-Z0-9] (?:r?nClasss[0-9] :s [a-zA-Z0-9] )*Z . Демонстрация: regex101.com/r/bleGnt/1

3. Спасибо, я собираюсь попробовать. кажется, это работает в вашей демонстрации, но не в моем проекте. Вероятно, потому, что разрыв строки в VB.NET является ли константа записанным vbLf или что-то вроде этого… мне придется его скорректировать. В любом случае, спасибо!

4. Используйте r?n затем. Или [rn] (но это также приведет к сопоставлению пустых строк).

Ответ №1:

Вы можете использовать

 ^Class[ t] [0-9] :[ t] w (?:r?nClass[ t] [0-9] :[ t] w )*$
  

Или, если разрывы строк могут быть просто CR:

 ^Class[ t] [0-9] :[ t] w (?:(?:rn?|n)Class[ t] [0-9] :[ t] w )*$
  

Или, версия, не зависящая от последовательности разрыва строки (где r?n заменяется на [rn] , но между допустимыми строками могут совпадать пустые строки):

 ^Class[ t] [0-9] :[ t] w (?:[rn] Class[ t] [0-9] :[ t] w )*$
  

Смотрите демонстрацию регулярных выражений

Я предлагаю использовать [ t] вместо s для сопоставления горизонтальных пробелов (это будет работать как на стороне сервера, так и на стороне клиента) и заменить [a-zA-Z] на w , которое соответствует буквам, цифрам и символам подчеркивания, а не только буквам (поскольку ваш пример тоже содержит цифры).

Основное отличие заключается в (?:r?nYOUR_SINGLE_LINE_PATTERN)* части, которая сопоставляет все последующие строки в желаемом формате, если таковой имеется.

Подробные сведения

  • ^ — начало строки
  • Class — последовательность символов
  • [ t] — 1 или более табуляций или пробелов
  • [0-9] — 1 или более цифр
  • : — двоеточие
  • [ t] — 1 или более табуляций или пробелов
  • w — один или несколько символов word
  • (?:r?nClass[ t] [0-9] :[ t] w )* — 0 или более повторений необязательного CR ( vbCr ), за которым следует обязательный символ новой строки ( vbLf ) (или, если [rn] используется, только один или более символов CR или / и LF, или, если (?:rn?|n) используется, CRLF, CR или LF разрыв строки) и шаблон первой строки
  • $ — конец строки.

Комментарии:

1. Спасибо за ваш подробный ответ. очень признателен. У меня были проблемы с предыдущим предложением, и ваше работает отлично. Я думаю, что это как-то связано с разрывом строки, но вы, кажется, предлагаете то же самое, что и парень раньше ( r? n).