Почему класс символов белого пространства не используется в Regex? [Дубликат]

Чтобы понять проблему, полезно сделать сравнение с массивами.

List не является подклассом List. Но Dog[] является подклассом Animal[].

Массивы являются reifiable и ковариантными. Подтверждаемый означает, что их информация о типе полностью доступна во время выполнения. Поэтому массивы обеспечивают безопасность типа времени выполнения, но не безопасность типа компиляции.

    // All compiles but throws ArrayStoreException at runtime at last line
    Dog[] dogs = new Dog[10];
    Animal[] animals = dogs; // compiles
    animals[0] = new Cat(); // throws ArrayStoreException at runtime

Это наоборот для дженериков: дженерики стерты и инвариантны. Поэтому генераторы не могут обеспечить безопасность во время выполнения, но они обеспечивают безопасность типа компиляции. В приведенном ниже коде, если дженерики были ковариантными, можно сделать загрязнение кучи в строке 3.

    List dogs = new ArrayList<>();
    List animals = dogs; // compile-time error, otherwise heap pollution
    animals.add(new Cat());

5
задан Traffy 18 April 2013 в 09:02
поделиться

3 ответа

- обозначает диапазон символов, так же, как вы используете A-Z для описания любого символа между A и Z . В вашем регулярном выражении используется ñ-\s, который движок пытается интерпретировать как любой символ между - и \ s - и затем замечает, что \s не имеет здесь большого смысла, потому что \s является только аббревиатурой для любого символа пробела.

Вот откуда исходит ошибка.

Чтобы избавиться от этого, вы всегда должны поместите - в конец вашего символьного класса, если вы хотите включить буквенный символ -:

@"^[a-zA-Zàéèêçñ\s][a-zA-Zàéèêçñ\s-]+$"

Таким образом, движок знает, что \s- это не диапазон символов, а два символа \s и - отдельно.

Другой способ - выйти из символа -:

@"^[a-zA-Zàéèêçñ\s][a-zA-Zàéèêç\-\s]+$"

Итак, теперь двигатель интерпретирует ñ\-\s не как диапазон символов, а как любой из символов ñ, - или \s . Лично, хотя я всегда стараюсь избегать ускорения как можно чаще, потому что IMHO он засоряется и бесполезно растягивает выражение в длину.

9
ответ дан Florian Peschka 25 August 2018 в 04:32
поделиться

[RegularExpression (@ "^ [a-zA-Z \ s] + $", ErrorMessage = "Разрешены только буквенные символы и пробелы.")]

Это работает

0
ответ дан Code First 25 August 2018 в 04:32
поделиться

Вам нужно избежать последнего символа - - синтаксический анализ ñ-\s, как диапазон a-z:

@"^[a-zA-Zàéèêçñ\s][a-zA-Zàéèêçñ\-\s]+$"

См. также в Regex Storm: [a-\s] , [a\-\s]

4
ответ дан Kobi 25 August 2018 в 04:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: