#asp.net #regex
#asp.net #регулярное выражение
Вопрос:
В asp.net приложение, мне нужно проверить пользовательский ввод на соответствие настраиваемому регулярному выражению. У меня есть список таких регулярных выражений в БД, и он настраивается пользователем, а не фиксируется. Моя проблема в том, что в этих регулярных выражениях точка предназначена для соответствия не какому-либо символу, а любому «разумному» символу (разумному в этом контексте: буквам, цифрам и некоторым другим символам ascii). Таким образом, процесс проверки выполняется в 2 этапа
- Сверьтесь с reg exp из списка
- Проверьте «разумные» символы чем-то вроде
^[w. /-]*$
Я хотел бы использовать одно регулярное выражение, чтобы я мог поместить его в один валидатор регулярных выражений на странице — это обеспечивает лучший пользовательский интерфейс. Я могу сделать это, выполнив поиск точек внутри регулярного выражения и заменив их своим более строгим классом символов [w. /-]
. Но не все точки имеют одинаковое значение в регулярном выражении.
Итак, мой вопрос: есть проверенный способ найти точки внутри регулярного выражения, но только при использовании в качестве класса символов? Может быть, регулярное выражение?
Комментарии:
1. Итак, вы спрашиваете, как исправить выражения, которые неправильно используют
.
? Как вы сможете определить, какие точки на самом деле означают «какой-то другой класс»? Существует ли определенный шаблон?2. @PanagiotisKanavos да. Любые точки, которые имеют это значение в регулярном выражении, например, не [,.-], которые имеют буквальное значение.
3. Я спрашиваю — как вы можете знать, что точка здесь означает одно, а через несколько символов другое? Единственный намек, который
[,.-]
, возможно, следует рассматривать по-другому, — это ваш комментарий или предположение, что если группа будет содержать дублирование с «другим» значением, ее не следует рассматривать как это «другое» значение.4. @PanagiotisKanavos нет. По определению, в регулярном выражении точка используется как литерал, когда находится внутри []. Это не то, что определено мной, это то, как работают регулярные выражения. Но я не такой эксперт в regexp, чтобы быть уверенным, что найду все особые случаи.
Ответ №1:
Просто чтобы попасть на ту же страницу, в a.b[.].[.[]
должны быть найдены две точки: между a
и b
, и последняя точка, между экранированными фигурными скобками. Остальные являются буквенными точками.
К счастью для нас, ASP.NET не знает о Q
и E
для избежания фрагментов шаблона.
Вы можете использовать это регулярное выражение:
(?<!\).(?!(?:\[][]|[^][])*(?<!\)])
На демонстрации обратите внимание, что сопоставляется только правильная точка.
Объяснение
- Взгляд назад
(?<!\)
гарантирует, что нам не предшествует экранирующая обратная косая черта .
соответствует точке, которую мы хотим- Отрицательный прогноз
(?!(?:\[][]|[^][])*(?<!\)])
гарантирует, что за нами не последует… (?:\[][]|[^][])*
любое количество символов[
,], or non
[]`, затем- закрывающая скобка, которой не предшествует обратная косая черта:
(?<!\)]
Ссылка
Комментарии:
1. Вау! Спасибо и за справочные ссылки