#c# #.net #regex #numeric #numerical
#c# #.net #регулярное выражение #числовое
Вопрос:
Я использую C # и .NET, и у меня есть регулярное выражение, которое выглядит следующим образом
"D"
Это соответствует всем нечисловым символам, однако я не хочу, чтобы это соответствовало десятичной точке (.) и знаку отрицания (-). Как я могу сделать это с помощью регулярных выражений?
Итак, я попробовал Chris, и он внес несколько изменений, чтобы заставить его работать:
(У меня есть текстовое поле с именем «Original»)
private void Original_TextChanged(object sender, EventArgs e) {
Regex regex = new Regex(@"[^d.-]", RegexOptions.IgnoreCase);
Match match = regex.Match(Original.Text);
if (match.Success) {
Original.Text = regex.Replace(Original.Text, "");
Original.SelectionStart = Original.TextLength;
}
}
Это Original.SelectionStart = Original.TextLength;
потому, что всякий раз, когда оно заменялось, оно помещало выделение в начало, и это показалось бы пользователю немного странным…
Ответ №1:
Вы можете использовать класс отрицаемых символов, чтобы исключить числа, .
и -
. Выражение для сопоставления одного символа, подобного этому, является [^d.-]
. Курсор указывает, что класс отрицается.
Regex.IsMatch("a f", @"^[^d.-] $"); // true
Regex.IsMatch("a_f", @"^[^d.-] $"); // true
Regex.IsMatch("a.f", @"^[^d.-] $"); // false
Regex.IsMatch("af-", @"^[^d.-] $"); // false
Regex.IsMatch("-42", @"^[^d.-] $"); // false
Regex.IsMatch("4.2", @"^[^d.-] $"); // false
Комментарии:
1. На самом деле нет необходимости экранировать
-
в этой позиции: можно также прекрасно использовать[^d.-]
.2. @mousio: да! Хороший момент, хотя я всегда с опаской отношусь к этому 🙂 Глупое суеверие, я полагаю.
3. Также нет необходимости избегать точки. Помните, что классы символов, заключенные в квадратные скобки, имеют (почти) полностью отличный синтаксис от остальной части регулярного выражения.
[^d.-]
действительно сработало бы. Тем не менее, трудно винить людей за то, что они избегают ДЕФИСА с МИНУСОМ, поскольку он и каретка чувствительны к положению относительно того, нужно ли им экранирование, чтобы рассеять их (ab) обычную магию.4. То же самое касается
.
, любого места внутри (отрицаемого) символьного класса, но я могу согласиться с вами, чтобы просто экранировать в любом случае, когда вы хотите выразить литерал :]