Регулярное выражение, указывающее, не содержит ли строка определенного символа

StackOverflow https://stackoverflow.com/questions/198781

  •  10-07-2019
  •  | 
  •  

Вопрос

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

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

Например,

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

и

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

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

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

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

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

Редактировать 1:

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

Редактировать 2:

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

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

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

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

^((?!0).)*$

Эта конструкция называется Негативный взгляд

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top