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

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

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

например,

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

и

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

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

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

идеи? Полагаю, это что-то маленькое.

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

Edit1:

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

Edit2:

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

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

надеюсь, что помогает.

6 ответов


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

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

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

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


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


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


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

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

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

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


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

^((?!0).)*$