Regex для поиска недопустимых символов в целых числах с пробелами - PullRequest
0 голосов
/ 16 февраля 2020

Я хочу использовать регулярное выражение (регулярное выражение), чтобы найти недопустимые символы в строке. Строка вводится пользователем, и когда регулярное выражение находит недопустимые символы, я хочу дать пользователю обратную связь, какие символы были недопустимыми. Пример предупреждающего сообщения: «Допускается только 0-9 и пробел. Найдены недопустимые символы: ab», когда ввод был "- 10 a 0 b".

Допустимая строка:

  • целое число
  • отрицательным или положительным
  • разрешено иметь любое количество пробелов в любой позиции.

Так, например, эти строки VALID НЕ должны соответствовать регулярному выражению:

"-100"  
"- 1 00"
"  - 1 00"
"100"  
" 1 0 0 "  
"1 00" 

Хотя регулярное выражение должно находить совпадения в следующих строках INVALID:

"- 1 a 0 0 b" should match "a" and "b"
"- 1 a 0 0 -" should match "a" and "-"

У меня было рабочее регулярное выражение для положительных целых чисел, пока я не обнаружил, что забыл включить отрицательные целые числа:

var regex = new Regex(@"[^0-9\s]")
var invalidCharacters = regex.Matches(text)

У меня есть только очень базовое c знание регулярных выражений. Я попытался отрицать регулярное выражение, чтобы включить отрицательные целые числа, но оно не работает:

new Regex(@"(?!-?[0-9\s])")

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

Ответы [ 2 ]

1 голос
/ 17 февраля 2020

Вы можете использовать

var invalidCharacters = Regex.Matches(text, @"[^0-9\s-]|(?<!^\s*)-");

См. Демонстрационный пример регулярных выражений (немного изменен, поскольку демонстрационный пример является тестом для одной многострочной строки.)

Регулярное выражение соответствует:

  • [^0-9\s-] - символ, отличный от ASCII di git, любой символ пробела Unicode или - char
  • | - или
  • (?<!^\s*)- - символ -, которому не предшествует начало строки, любые 0+ пробельных символов.
1 голос
/ 17 февраля 2020

Я бы подошел к этому, подумав сначала о положительном случае - какие строки допустимы? И затем отрицаем, что с отрицательным взглядом.

Я думаю, что это соответствует вашим требованиям:

(?!\s*-?[\d\s]).
  • \s* будет соответствовать любому пробелу в начале

  • -? при желании будет соответствовать дефису

  • [\d\s] будет соответствовать числам и пробелам

  • (?!expression) - это отрицательный обходной путь, сводящий на нет все выражение

  • . в конце - это способ создания совпадений. Отрицательный ответ - просто утверждение - он не возвращает никаких результатов.

Он дает желаемые результаты для тестовых случаев в вашем вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...