Подтвердить что ты не робот

Ошибка .NET Regex: диапазон [x-y] в обратном порядке

Я создаю Regex, и до сих пор я это делал и пробовал,

 ^([0][1-9]|1[0-2])[/-.]

и я получаю следующую ошибку.

      parsing "^([0][1-9]|1[0-2])[/-.]" - [x-y] range in reverse order. 
      Description: An unhandled exception occurred during the execution of the current web request.          
      Please review the stack trace for more information about the error and where it originated in  
      the code. 

      Exception Details: System.ArgumentException: parsing "^([0][1-9]|1[0-2])[/-.]" - [x-y] range 
      in reverse order.

После беспорядка и поиска ошибки в моем регулярном выражении я просто изменил регулярное выражение на

  ([0][1-9]|1[0-2])[-/.]  so basically only changed this [/-.] to [-/.]

и это сработало.

Затем я попробовал некоторые другие комбинации, которые сработали.

   [/-]  [/.]  [/.-]  [/-?]

Тогда я попробовал некоторые другие, которые не сработали.

   [/-\*]  [/-\+]

Таким образом, очевидно, что "-" имеет проблемы в некоторых местах, но не проблема в других. Это ошибка? или я чего-то не хватает?

Update

Спасибо, ребята, указав, что "-" считается диапазоном, если он посередине или не экранирован "\".

Однако, почему он работал для [/-?] или [/- \?], действительно ли он определяет диапазон здесь или воспринимает его буквально?

4b9b3361

Ответ 1

Не ошибка. Внутри символьного класса (обозначается символом […]) символ - должен быть первым (некоторые варианты допускают, по-моему, первый или последний), если он должен быть включен как литерал. В противном случае ожидается обозначение диапазона, например 0-9 или A-Z или даже /-..

Проблема заключается в том, что согласно ASCII (или Unicode?), . предшествует /, поэтому диапазон интерпретируется как обратный, эквивалентный заданию диапазона 7-4.

Если вы использовали [.-/], я бы не ожидал исключения синтаксического анализа, но вы не получили ожидаемых результатов.

Ответ 2

Проблема заключается в этой части:

[/-.]

Это означает, что диапазон символов от '/' до '.' "- но '/' появляется после '.' в Unicode, поэтому диапазон не имеет смысла.

Если вы хотите, чтобы это означало "слэш, тире или период", вы хотите:

[/\-.]

... другими словами, вам нужно уйти от тире. Обратите внимание, что если это обычный строковый литерал С#, вам также необходимо выполнить еще один уровень экранирования:

string pattern = "[/\\-.]";

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

string pattern = @"[/\-.]";

В качестве альтернативы, как предположил Джей, вы можете просто поставить тире в начале:

[-/.]

или end:

[/.-]

(Я только что протестировал, и все три из этих параметров работают.)

Ответ 3

Внутри класса символов, т.е. [], - обозначает диапазон, то есть все строчные буквы между a и z могут быть выражены как [a-z].

Каков диапазон для [/-.]?