RegEx, чтобы сказать, если строка не содержит определенный символ - PullRequest
34 голосов
/ 13 октября 2008

Простой вопрос на этот раз.

Я пытаюсь проверить, содержит ли строка символ с помощью регулярных выражений. Я думал, что это выражение имеет форму «[^ x ]», где x - это символ, которого вы не хотите видеть, но, похоже, он не работает.

Например,

Regex.IsMatch("103","[^0]")

и

Regex.IsMatch("103&","[^&]")

оба возвращают true (я бы ожидал false).

Я начал использовать "[^&]" и подумал, что, возможно, & нужно экранировать как \ &, но, похоже, это ничего не меняет.

Идеи? Я предполагаю, что это что-то маленькое.

Кроме того, я использую .NET, так что имейте это в виду.

Edit1:

Я нашел это , но, похоже, это не отвечает на проблему, с которой я столкнулся.

Edit2:

Я хотел бы ответить на предложения Кевина и Джоэла . Эти предложения действительно были бы быстрее, но они не достигли той гибкости, которая мне нужна в этом случае, поэтому, если вы нашли этот вопрос с помощью поиска, обязательно посмотрите, соответствуют ли их ответы вашим потребностям. В моем случае регулярное выражение передается в метод проверки DataTable, который проходит по каждой строке и проверяет, что содержимое этой строки в определенном столбце соответствует RegEx, который передается. Поскольку я буду использовать этот метод повторно для нескольких других проверяемых таблиц данных я хотел бы:

  1. Используйте Regex, чтобы включить самый широкий диапазон проверок, и
  2. Всегда ищите положительное совпадение (т. Е. Вместо использования! Regex.IsMatch (ячейка, regexvariable), я хотел полагаться на возможность всегда использовать Regex.IsMatch (ячейка, regexvariable), так как большинство DataTables вызывает этот метод будет использовать положительное совпадение вместо отрицательного.

Надеюсь, это поможет.

Ответы [ 6 ]

51 голосов
/ 13 октября 2008

Ваше решение наполовину верно. Матч, который вы видите, для других персонажей. Вы хотите сказать что-то вроде «эй! Я не хочу видеть этот символ во всей строке».

В этом случае вы делаете:

Regex.IsMatch("103","^[^0]*$")
17 голосов
/ 13 октября 2008

Шаблон [^ 0] будет соответствовать любому символу, который не является нулем. В обоих ваших примерах шаблон будет соответствовать первому символу («1»). Чтобы проверить, не содержит ли вся строка нулей, шаблон должен быть «^ [^ 0] * $». Это читается следующим образом: начинаются с начала строки, соответствуют произвольному количеству символов, которые не являются нулями, после чего сразу следует конец строки Любая строка, содержащая ноль, потерпит неудачу. Любая строка, не содержащая нулей, пройдет.

7 голосов
/ 13 октября 2008

, если вы ищете один символ в строке, регулярное выражение выглядит немного излишним. Почему бы просто не использовать .IndexOf или .Contains?

4 голосов
/ 13 октября 2008

Первый символ, который достигает синтаксический анализатор, равен «1», что верно для [^ 0] и также верно для [^ &], поэтому в обоих этих примерах он вернет true.

2 голосов
/ 23 марта 2010

Я наткнулся на этот вопрос, ища то же самое, но для JavaScript. Выражение выше не сработало в моем случае, но я натолкнулся на выражение ниже, которое сработало. (На всякий случай, если кто-то еще ищет решение JavaScript, то и здесь.)

^((?!0).)*$

Эта конструкция называется Negative Lookahead

2 голосов
/ 13 октября 2008

Вы ставите свое отрицание не в том месте. [^x] будет соответствовать всему, что не х. Если x находится в строке, строка все равно соответствует выражению, если есть и другие символы. Вместо этого вы хотите сопоставить истину, если x существует, а затем отменить результат функции:

Not Regex.IsMatch("103", "0")

Not Regex.IsMatch("103&", "&")

Не то чтобы с этими простыми примерами нормальный String.IndexOf () или String.Contains () был бы лучшим выбором.

...