Подтвердить что ты не робот

RegEx, чтобы определить, не содержит ли строка определенного символа

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

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

Например,

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

и

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

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

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

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

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

Edit1:

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

Edit2:

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

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

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

4b9b3361

Ответ 1

Ваше решение наполовину правое. Совпадение, которое вы видите, предназначено для других персонажей. То, что вы хотите сказать, это что-то вроде "эй, я не хочу видеть этот символ во всей строке".

В этом случае вы выполните:

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

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

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

Ответ 6

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

^ ((?! 0).) * $