Символы из набора и диапазона символов регулярного выражения

1

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

Так, например, у меня есть регулярное выражение [^A-Za-z0-9/_#\-\.]+ которое ничего не заменяет ничего вне этого диапазона (это для формата url, который я хочу).

У меня есть другой набор, который является просто [A-Za-z0-9/_#\-\.], [A-Za-z0-9/_#\-\.] является только обратным приведенному выше правилу. Я не возражаю, что я имею правило дважды, поскольку они будут сделаны в одно и то же время в любом случае.

Идея того, что я хочу, состоит в том, что я могу отображать все допустимые символы во втором выражении, поэтому он должен читать что-то вроде: (некоторые для краткости удаляются)

A, B, C, D.... Z, a, b, c, d.... z, 0,1,2,3... 9,/, _, #, -,.

Есть ли способ вытащить все эти символы из регулярного выражения?

Моя единственная идея в настоящее время состоит в том, чтобы проанализировать символ либо размер - (где это не пробел, либо запятая), а затем создать набор символов, основанный на диапазоне между двумя символами из его символьного кода.

Кто-нибудь получил какие-нибудь идеи? Или что-то я пропустил?
Я выложу свою идею, как только я это сделаю, если кто-то не сможет быстро избавить меня от хлопот!

Благодарю.

Теги:
string

1 ответ

2
Лучший ответ

Поскольку char в.NET имеет только 2 16 возможных значений, поочередно повторяя все символы и подавая их в свое регулярное выражение, вы должны предоставить приемлемое решение. Если вы знаете, что ввод ограничен символами с латинской страницы, вы можете ограничить проверку грубой силы на начальные 256 символов.

var rx = new Regex("[^A-Za-z0-9/_#\\-.]+");
for (char ch = (char)0 ; ch <= (char)255 ; ch++) {
    if (!rx.Match(""+ch).Success) {
        Console.Write(ch);
    }
}

Это печатает #-./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz

Демо на идеон.

  • 0
    Я думаю, что это вполне разумная идея, могут ли 256 совпадений регулярных выражений быть довольно жестокими, хотя для простоты вывода? Я мог бы начать индекс с 32, хотя я все равно думаю.
  • 0
    @danrichardson Вы можете собрать вывод в строку, а затем изменить порядок так, как вам нравится. Например, вы можете написать простой цикл, который ищет «прямые трассы», и заменить подстроки, например 0123456789 описанием «любая цифра» или 0..9 диапазона 0..9 , или что-то в этом роде. Я думаю, что с исчерпывающим списком символов легче работать, чем с регулярным выражением «черного ящика».
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню