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, вызывающих этот метод будет использовать положительное совпадение вместо отрицательного.
Надеюсь, это поможет.
Ответы
Ответ 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).) * $