Используйте
@"^[^\W_]+(?: [^\W_]+){0,8}$"
, чтобы разрешить все, что соответствует \w
, кроме _
.
\W
означает «любой символ, которому не соответствует \w
», поэтому, поместив его в класс символов с отрицанием и добавив _
в этот класс, мы фактически вычтем _
из \w
. *
Другими словами, [^\W_]
означает «соответствовать любому символу, который не является ни буквенно-цифровым символом, ни подчеркиванием».
Другим способом (возможно, более явным и простым для понимания) было бы использование свойств Unicode:
@"^[\p{L}\p{N}]+(?: [\p{L}\p{N}]+){0,8}$"
, где [\p{L}\p{N}]
означает «любая буква или цифра Unicode».
* В .NET сокращение
\w
соответствует намного большему, чем
[A-Za-z0-9_]
, особенно международные (не ASCII) буквы.