Регулярное выражение * не * соответствует ни одному символу

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

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

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

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

11 ответов

Решение

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

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

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

Рекомендации

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

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

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

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

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

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

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

Для справки:

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

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

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

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

" {10000}"

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

((?iLmsux))

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

Интересно... самый очевидный и простой вариант:

~^

.

https://regex101.com/r/KhTM1i/1

обычно требующий только одного шага вычисления (сбой непосредственно в начале и требующий больших вычислительных ресурсов, только если совпадающая строка начинается с длинной серии~) среди всех остальных ответов не упоминается... уже 12 лет.

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

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

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

Другие вопросы по тегам