Regex: сопоставить все, кроме определенного шаблона
310
Мне нужно регулярное выражение, способное сопоставить все, кроме строки, начиная с определенного шаблона (конкретно, index.phpи что следует, например index.php?id=2342343)
@ThomasOwens: Это зависит. Это зависит от того, какая часть выражения должна быть отрицана. Если все выражение должно быть отрицано, тогда вы получите точку. Например, если вы хотите закодировать «если строка не содержит« Брюса »в качестве подстроки, а затем сделать что-то», вы просто используете / Bruce / и вставляете отрицание в оператор if вне регулярного выражения , Но может случиться так, что вы захотите отрицать некоторые подвыражения. Скажем, вы ищете что-то вроде имени, фамилии, где имя - Брюс, а фамилия - все, кроме XYZ, где XYZ - фамилия некой знаменитости по имени Брюс.
Математические облака
Ответы:
250
Не эксперт по регулярным выражениям, но я думаю, что вы могли бы использовать отрицательный прогноз с самого начала, например, ^(?!foo).*$не должен совпадать с чем-либо, начиная с foo.
Другие механизмы, позволяющие искать обходные пути: (cat)|[^c]*(?:c(?!at)[^c]*)*(или (?s)(cat)|(?:(?!cat).)*, или (cat)|[^c]+(?:c(?!at)[^c]*)*|(?:c(?!at)[^c]*)+[^c]*), а затем проверять языком, означает: если группа 1 соответствует, это не то, что нам нужно, в противном случае, получить значение соответствия, если оно не пустое
определенный одиночный символ или набор символов :
Примечание к демонстрации : \nсимвол новой строки используется в классах отрицательных символов в демонстрациях, чтобы избежать переполнения совпадений для соседних строк. Они не нужны при тестировании отдельных строк.
Примечание привязки : во многих языках используйте \Aдля определения однозначного начала строки и \z(в Python \Z, в JavaScript $это нормально) для определения самого конца строки.
Примечание : во многих вариантах (но не в POSIX, TRE, TCL) .соответствует любому символу, кроме символа новой строки . Убедитесь, что вы используете соответствующий модификатор DOTALL ( /sв PCRE / Boost / .NET / Python / Java и /mв Ruby) для .соответствия любому символу, включая символ новой строки.
Примечание\n обратной косой черты : В языках, где вы должны объявлять шаблоны со строками C, допускающие escape-последовательности (например, для новой строки), вам необходимо удвоить обратную косую черту, избегая специальных символов, чтобы механизм мог обрабатывать их как буквенные символы (например, в Java, world\.будет объявлен как "world\\."или используйте класс символов:) "world[.]". Использование сырья строковых литералов (Python r'\bworld\b'), C # СТЕНОГРАФИЧЕСКИХ строковые литералы @"world\.", или slashy строка / регулярное выражение буквальной нотации как /world\./.
Отлично, пиши! Для случая «строка (не), равная некоторой строке», на примере ^(?!foo$), почему знак доллара должен быть в скобках, чтобы выражение работало? Я ожидал ^(?!foo)$дать такие же результаты, но это не так.
Грант Хамфрис
3
@GrantHumphries: когда $якорь находится внутри прогнозной точки, он является частью условия, частью этого утверждения нулевой ширины . Если бы он был снаружи, как, например, в ^(?!foo)$, он будет частью потребляющего шаблона, требующего конца строки сразу после начала строки, что делает отрицательный взгляд неуместным, поскольку он всегда будет возвращать true (после конца строки не может быть текста) не говоря уже foo). Таким образом, ^(?!foo$)сопоставляется начало строки, за которой не следует foo, за которой следует конец строки. ^(?!foo)$соответствует пустой строке.
Wiktor Stribiżew
@ robots.txt Пожалуйста, удалите эти комментарии. Вы задаете вопрос XY. Классы персонажей предназначены для соответствия одиночным символам, нет возможности определить последовательность символов с ними. Вероятно, вам следует просто найти подстроку между началом строки и первым появлением cotили lanи удалить совпадение, например regex.replace(myString, "^.*?(?:cot|lan)\s*", "").
Например, ваш связанный ответ терпит неудачу в этом примере: «Пакеты ing <! - и редакторы веб-страниц <! - asdasasdas -> теперь используют -> Lorem Ipsum»
MonsterMMORPG
259
Вы можете поместить ^в начало набора символов, чтобы соответствовать чему-либо, кроме этих символов.
Это правда, но он обрабатывает только один символ за раз. Если вы хотите исключить последовательность из двух или более символов, вы должны использовать отрицательный прогноз, как говорили другие респонденты.
Алан Мур
Идеальное решение, чтобы удалить любые нежелательные символы, кроме тех, которые в шаблоне. спасибо
Sirmyself
@ Алан, «... ты должен использовать негативную перспективу ...» - это неправильно, но мы не должны быть слишком жесткими с тобой, потому что Виктор не опубликовал свой ответ - что показывает почему - до 2016 года.
Кэри Свовеланд
6
Просто сопоставьте и /^index\.php/отклоните все, что соответствует.
Это будет отклонять "index_php" или "index # php".
1
Мне нужно регулярное выражение в состоянии соответствовать все , но за исключением того, в строку , начиная сindex.php определенного шаблона ( в частности , index.php и что следует, как index.php? ID = 2342343)
ОП специально запросил регулярное выражение ... Я не уверен, что это помогает! (Он может использовать grep, например, в командной строке или Perl / Python / любой другой язык, или команду «Выполнить это регулярное выражение для каждой строки» в текстовом редакторе и т. Д ...)
Ответы:
Не эксперт по регулярным выражениям, но я думаю, что вы могли бы использовать отрицательный прогноз с самого начала, например,
^(?!foo).*$
не должен совпадать с чем-либо, начиная сfoo
.источник
^((?!foo).)*$
( stackoverflow.com/a/406408/3964381 )Regex: соответствует всем, кроме :
foo
):^(?!foo).*$
^(?!foo)
^(([^f].{2}|.[^o].|.{2}[^o]).*|.{0,2})$
^([^f].{2}|.[^o].|.{2}[^o])|^.{0,2}$
world.
в конце):(?<!world\.)$
^.*(?<!world\.)$
^(.*([^w].{5}|.[^o].{4}|.{2}[^r].{3}|.{3}[^l].{2}|.{4}[^d].|.{5}[^.])|.{0,5})$
([^w].{5}|.[^o].{4}|.{2}[^r].{3}|.{3}[^l].{2}|.{4}[^d].|.{5}[^.]$|^.{0,5})$
foo
) (не соответствует лаковой POSIX, извините):^(?!.*foo)
^(?!.*foo).*$
|
символ):^[^|]*$
foo
):^(?!foo$)
^(?!foo$).*$
^(.{0,2}|.{4,}|[^f]..|.[^o].|..[^o])$
cat
):/cat(*SKIP)(*FAIL)|[^c]*(?:c(?!at)[^c]*)*/i
или/cat(*SKIP)(*FAIL)|(?:(?!cat).)+/is
(cat)|[^c]*(?:c(?!at)[^c]*)*
(или(?s)(cat)|(?:(?!cat).)*
, или(cat)|[^c]+(?:c(?!at)[^c]*)*|(?:c(?!at)[^c]*)+[^c]*
), а затем проверять языком, означает: если группа 1 соответствует, это не то, что нам нужно, в противном случае, получить значение соответствия, если оно не пустое[^a-z]+
(любой символ, кроме строчной буквы ASCII)|
:[^|]+
Примечание к демонстрации :
\n
символ новой строки используется в классах отрицательных символов в демонстрациях, чтобы избежать переполнения совпадений для соседних строк. Они не нужны при тестировании отдельных строк.Примечание привязки : во многих языках используйте
\A
для определения однозначного начала строки и\z
(в Python\Z
, в JavaScript$
это нормально) для определения самого конца строки.Примечание : во многих вариантах (но не в POSIX, TRE, TCL)
.
соответствует любому символу, кроме символа новой строки . Убедитесь, что вы используете соответствующий модификатор DOTALL (/s
в PCRE / Boost / .NET / Python / Java и/m
в Ruby) для.
соответствия любому символу, включая символ новой строки.Примечание
\n
обратной косой черты : В языках, где вы должны объявлять шаблоны со строками C, допускающие escape-последовательности (например, для новой строки), вам необходимо удвоить обратную косую черту, избегая специальных символов, чтобы механизм мог обрабатывать их как буквенные символы (например, в Java,world\.
будет объявлен как"world\\."
или используйте класс символов:)"world[.]"
. Использование сырья строковых литералов (Pythonr'\bworld\b'
), C # СТЕНОГРАФИЧЕСКИХ строковые литералы@"world\."
, или slashy строка / регулярное выражение буквальной нотации как/world\./
.источник
^(?!foo$)
, почему знак доллара должен быть в скобках, чтобы выражение работало? Я ожидал^(?!foo)$
дать такие же результаты, но это не так.$
якорь находится внутри прогнозной точки, он является частью условия, частью этого утверждения нулевой ширины . Если бы он был снаружи, как, например, в^(?!foo)$
, он будет частью потребляющего шаблона, требующего конца строки сразу после начала строки, что делает отрицательный взгляд неуместным, поскольку он всегда будет возвращать true (после конца строки не может быть текста) не говоря ужеfoo
). Таким образом,^(?!foo$)
сопоставляется начало строки, за которой не следуетfoo
, за которой следует конец строки.^(?!foo)$
соответствует пустой строке.cot
илиlan
и удалить совпадение, напримерregex.replace(myString, "^.*?(?:cot|lan)\s*", "")
.Вы можете поместить
^
в начало набора символов, чтобы соответствовать чему-либо, кроме этих символов.будет соответствовать всем, кроме
=
источник
Просто сопоставьте и
/^index\.php/
отклоните все, что соответствует.источник
str !~ /\Aindex\.php/
.В питоне:
источник
Используйте метод Exec
ИЛИ ДРУГОЕ МАТЧ
источник
Как насчет не использовать регулярное выражение:
источник
grep
, например, в командной строке или Perl / Python / любой другой язык, или команду «Выполнить это регулярное выражение для каждой строки» в текстовом редакторе и т. Д ...)