Регулярное выражение * не * соответствует ни одному символу - PullRequest
37 голосов
/ 28 мая 2010

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

Мое текущее регулярное выражение для этого "\^.*"

Проблема в том, что он не соответствует символам, как запланировано ... но для одного соответствия он работает. Строка, из-за которой он не работает, это ^ @ jj (в основном, все, что имеет ^ ...).

Каков будет лучший способ не соответствовать ни одному персонажу сейчас? Я думал об удалении \, но только сделав это, вы превратите «не» в «начало с» ...

Ответы [ 10 ]

64 голосов
/ 28 мая 2010

Символ ^ не означает «нет», кроме как внутри класса символов ([]). Если вы хотите, чтобы что-то не совпадало, вы можете использовать отрицательный прогноз, который соответствует чему-либо: (?!.*).

48 голосов
/ 28 мая 2010

Простое и дешевое регулярное выражение, которое никогда не будет соответствовать чему-либо, - это сопоставление с чем-то, что просто невозможно сопоставить, например: \b\B.

Это просто невозможно для этого регулярного выражения, поскольку это противоречие.

Ссылки

12 голосов
/ 14 апреля 2012

Еще один очень хорошо поддерживаемый и быстрый шаблон, который не будет соответствовать чему-либо с гарантированным постоянным временем:

$unmatchable pattern $anything goes here и т. Д.

$, конечно, указывает на конец строки. Никакие символы не могут идти после $, поэтому дальнейшие переходы между состояниями невозможны. Дополнительным преимуществом является то, что ваш шаблон интуитивно понятен, информативен и удобен для чтения!

1 голос
/ 28 мая 2010

Вместо того, чтобы пытаться не сопоставлять какие-либо символы, почему бы просто не сопоставить все символы? ^.*$ должен сделать свое дело. Если вам не нужно сопоставлять какие-либо символы, попробуйте ^\j$ (Если, конечно, ваш движок регулярных выражений не выдаст ошибку, если вы предоставите ему недопустимый класс символов. Если это так, попробуйте ^()$. Быстрый тест с RegexBuddy предполагает, что это может сработать.

0 голосов
/ 10 мая 2019

Пустое регулярное выражение

Лучшее регулярное выражение, которое никогда ничего не соответствует, - пустое регулярное выражение. Но я не уверен, что все движки регулярных выражений примут это.

Невозможное регулярное выражение

Другое решение - создать невозможное регулярное выражение. Я обнаружил, что $-^ занимает всего два шага для вычисления независимо от размера вашего текста (https://regex101.com/r/yjcs1Z/1).

Для справки:

  • $^ и $. выполнить 36 шагов для вычисления -> O (1)
  • \b\B делает 1507 шагов на моем примере и увеличивается с количеством символов в вашей строке -> O (n)
0 голосов
/ 27 января 2017
((?iLmsux))

Попробуйте, это соответствует, только если строка пуста.

0 голосов
/ 28 мая 2010

Эх, я знаю, что это немного поздно, но вы просто не можете прочитать какие-либо входные данные, если регулярное выражение пусто

0 голосов
/ 28 мая 2010

^ не только в классе (например, [^ a-z] означает что угодно, кроме a-z). Вы превратили его в буквальный ^ с обратной косой чертой.

То, что вы пытаетесь сделать, это [^] *, но это не законно. Вы можете попробовать что-то вроде

" {10000}"

, что соответствует 10000 пробелов, если это больше, чем ваш максимальный ввод, он никогда не должен совпадать.

0 голосов
/ 28 мая 2010

Вы хотите ничего не соответствовать вообще ? Отрицательный взгляд кажется очевидным, но может быть медленным, возможно ^$ (соответствует только пустой строке) в качестве альтернативы?

0 голосов
/ 28 мая 2010

Вы пробовали это простое регулярное выражение? [^.]*

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...