Используйте Regex для поиска точек Regex внутри регулярных выражений

#asp.net #regex

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

Вопрос:

В asp.net приложение, мне нужно проверить пользовательский ввод на соответствие настраиваемому регулярному выражению. У меня есть список таких регулярных выражений в БД, и он настраивается пользователем, а не фиксируется. Моя проблема в том, что в этих регулярных выражениях точка предназначена для соответствия не какому-либо символу, а любому «разумному» символу (разумному в этом контексте: буквам, цифрам и некоторым другим символам ascii). Таким образом, процесс проверки выполняется в 2 этапа

  1. Сверьтесь с reg exp из списка
  2. Проверьте «разумные» символы чем-то вроде ^[w. /-]*$

Я хотел бы использовать одно регулярное выражение, чтобы я мог поместить его в один валидатор регулярных выражений на странице — это обеспечивает лучший пользовательский интерфейс. Я могу сделать это, выполнив поиск точек внутри регулярного выражения и заменив их своим более строгим классом символов [w. /-] . Но не все точки имеют одинаковое значение в регулярном выражении.

Итак, мой вопрос: есть проверенный способ найти точки внутри регулярного выражения, но только при использовании в качестве класса символов? Может быть, регулярное выражение?

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

1. Итак, вы спрашиваете, как исправить выражения, которые неправильно используют . ? Как вы сможете определить, какие точки на самом деле означают «какой-то другой класс»? Существует ли определенный шаблон?

2. @PanagiotisKanavos да. Любые точки, которые имеют это значение в регулярном выражении, например, не [,.-], которые имеют буквальное значение.

3. Я спрашиваю — как вы можете знать, что точка здесь означает одно, а через несколько символов другое? Единственный намек, который [,.-] , возможно, следует рассматривать по-другому, — это ваш комментарий или предположение, что если группа будет содержать дублирование с «другим» значением, ее не следует рассматривать как это «другое» значение.

4. @PanagiotisKanavos нет. По определению, в регулярном выражении точка используется как литерал, когда находится внутри []. Это не то, что определено мной, это то, как работают регулярные выражения. Но я не такой эксперт в regexp, чтобы быть уверенным, что найду все особые случаи.

Ответ №1:

Просто чтобы попасть на ту же страницу, в a.b[.].[.[] должны быть найдены две точки: между a и b , и последняя точка, между экранированными фигурными скобками. Остальные являются буквенными точками.

К счастью для нас, ASP.NET не знает о Q и E для избежания фрагментов шаблона.

Вы можете использовать это регулярное выражение:

 (?<!\).(?!(?:\[][]|[^][])*(?<!\)])
  

На демонстрации обратите внимание, что сопоставляется только правильная точка.

Объяснение

  • Взгляд назад (?<!\) гарантирует, что нам не предшествует экранирующая обратная косая черта
  • . соответствует точке, которую мы хотим
  • Отрицательный прогноз (?!(?:\[][]|[^][])*(?<!\)]) гарантирует, что за нами не последует…
  • (?:\[][]|[^][])* любое количество символов [ , ], or non []`, затем
  • закрывающая скобка, которой не предшествует обратная косая черта: (?<!\)]

Ссылка

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

1. Вау! Спасибо и за справочные ссылки