Регулярное выражение * не * соответствует ни одному символу
Я знаю, что это довольно странная цель, но для быстрого и грязного исправления для одной из наших систем нам не нужно фильтровать какие-либо входные данные и допускать повреждение в системе.
Мое нынешнее регулярное выражение для этого "\^.*
"
Проблема в том, что он не соответствует символам, как запланировано... но для одного совпадения это работает. Строка, из-за которой он не работает, это ^@jj (в основном все, что имеет ^ ...)
Каков будет лучший способ не соответствовать ни одному персонажу сейчас? Я думал об удалении \
но только делая это превратит "не" в "начать с"...
11 ответов
^
символ не означает "нет", кроме как внутри класса символов ([]
). Если вы хотите что-то не сопоставить, вы можете использовать отрицательный прогноз, который соответствует чему-либо: (?!.*)
,
Простое и дешевое регулярное выражение, которое никогда не будет соответствовать чему-либо, - это сопоставление с чем-то, что просто невозможно сравнить, например: \b\B
,
Это регулярное выражение просто невозможно сопоставить, так как это противоречие.
Рекомендации
- регулярные выражения.инфо \ границы слов
\B
является отрицательной версией\b
,\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 лет.
Вы хотите ничего не соответствовать вообще? Отрицательный взгляд кажется очевидным, но может быть медленным, возможно ^$
(соответствует только пустой строке) в качестве альтернативы?
Э, я знаю, что это немного поздно, но вы не могли бы просто прочитать любой ввод, если регулярное выражение пусто