Ответ 1
Символ ^
не означает "не", кроме внутри класса символов ([]
). Если вы хотите ничего не сопоставить, вы можете использовать отрицательный lookahead, который соответствует чему-либо: (?!.*)
.
Я знаю, что здесь довольно странная цель, но для быстрого и грязного исправления для одной из наших систем нам не нужно фильтровать какие-либо входные данные и позволять коррупции входить в систему.
Мое текущее регулярное выражение для этого - "\^.*
"
Проблема заключается в том, что он не соответствует символам, как планировалось... но для одного соответствия он действительно работает. Строка, которая не работает, это ^ @jj (в основном все, что имеет ^...).
Каким будет лучший способ не совместить персонажей? Я думал об удалении \
, но только это превратит "не" в "начало с"...
Символ ^
не означает "не", кроме внутри класса символов ([]
). Если вы хотите ничего не сопоставить, вы можете использовать отрицательный lookahead, который соответствует чему-либо: (?!.*)
.
Простое и дешевое регулярное выражение, которое никогда не будет соответствовать чему-либо, должно совпадать с чем-то, что просто неприменимо, например: \b\B
.
Это просто невозможно для соответствия этого регулярного выражения, поскольку это противоречие.
\B
является отрицательной версией \B
. \B
соответствует в каждой позиции, где \B
нет.Еще один очень хорошо поддерживаемый и быстрый шаблон, который не соответствовал бы чему-либо, гарантированному постоянным временем:
$unmatchable pattern
$anything goes here
и т.д.
$
, конечно, указывает конец строки. Никакие символы не могли пойти после $
, поэтому дальнейшие переходы состояния не могли быть сделаны. Дополнительным преимуществом является то, что ваш шаблон интуитивно понятен, самоописателен и читабельен!
Вместо того, чтобы пытаться не сопоставить какие-либо символы, почему бы не просто совместить все символы? ^.*$
должен сделать трюк. Если вам не нужно сопоставлять какие-либо символы, попробуйте ^\j$
(Предположим, что ваш механизм регулярных выражений не будет вызывать ошибку, если вы предоставите ему недопустимый класс символов. Если это так, попробуйте ^()$
. Быстрый тест с RegexBuddy предполагает, что это может сработать.
^ это не только в классе (например, [^ a-z], означающем ничего, кроме a-z). Вы обратили его в буквальный символ ^ с обратной косой чертой.
То, что вы пытаетесь сделать, это [^] *, но это не законно. Вы можете попробовать что-то вроде
" {10000}"
который соответствовал бы точно 10 000 пробелов, если это больше, чем ваш максимальный вход, его никогда не следует сопоставлять.
((?iLmsux))
Попробуйте это, оно будет соответствовать только в том случае, если строка пуста.
Лучшее регулярное выражение, чтобы никогда ничего не совпадать - пустое регулярное выражение. Но я не уверен, что все движки регулярных выражений примут это.
Другое решение - создать невозможное регулярное выражение. Я обнаружил, что $-^
для вычисления занимает всего два шага, независимо от размера вашего текста (https://regex101.com/r/yjcs1Z/1).
$^
и $.
сделать 36 шагов для вычисления → O (1)\b\B
делает 1507 шагов на моем примере и увеличивается с числом символов в вашей строке → O (n)Вы вообще ничего не хотите комбинировать? Негативные образы кажутся очевидными, но могут быть медленными, возможно, ^$
(только для пустых строк) в качестве альтернативы?
Вы пробовали это простое регулярное выражение? [^.]*
Eh Я знаю, что это немного поздно, но вы можете просто не читать какие-либо данные, если регулярное выражение пуст