Мне нужно регулярное выражение, способное сопоставить все , но строку, начинающуюся с определенного шаблона (в частности index.php и следующего, как index.php?id=2342343)
Regex: сопоставить все, кроме определенного шаблона
Ответ 1
Не эксперт по регулярному выражению, но я думаю, что с самого начала можно было бы использовать негативный взгляд. ^(?!foo).*$ не должно соответствовать чему-либо, начиная с foo.
Ответ 2
Вы можете поместить ^ в начале набора символов, чтобы оно соответствовало чему-либо, кроме этих символов.
[^=]*
будет соответствовать всем, кроме =
Ответ 3
Regex: соответствие всем , но:
- строка , начинающаяся с определенного шаблона (например, любая - пустая, тоже - строка, не начинающаяся с
foo):- Решение, основанное на Lookahead для NFA:
- Отрицательное решение на основе класса символов для двигателей регулярных выражений, не поддерживающих поисковые запросы:
- строка , заканчивающаяся определенным шаблоном (скажем, no
world.в конце):- Решение на основе Lookbehind:
- Обходное решение POSIX:
- строка , содержащая определенный текст (скажем, не соответствует строке с
foo) (нет POSIX-совместимого patern, извините): - строка , содержащая специальный символ (скажем, избегайте сопоставления строки с символом
|): - строка , равная некоторой строке (скажем, не равной
foo):- Lookaround на основе:
- POSIX:
- a последовательность символов:
- PCRE (соответствует любому тексту, но
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 соответствует, это не то, что нам нужно, иначе, возьмите значение соответствия, если не пусто.
- PCRE (соответствует любому тексту, но
- a определенный одиночный символ или набор символов:
- Используйте отрицательный класс символов:
[^a-z]+(любой char, отличный от строчного ASCII письмо) - Соответствие любому char (s), но
|:[^|]+
- Используйте отрицательный класс символов:
Демонстрационная заметка: новая строка \n используется внутри классов с отрицанием символов в демонстрационных целях, чтобы избежать переполнения соответствия соседней строке. Они не нужны при тестировании отдельных строк.
Якорная заметка. На многих языках используйте \A для определения однозначного начала строки и \z (в Python это \z, в JavaScript, $ - OK), чтобы определить самый конец строки.
Точечная заметка: во многих вариантах (но не в POSIX, TRE, TCL), . соответствует любой char, но новой строке char. Убедитесь, что вы используете соответствующий модификатор DOTALL (/s в PCRE/Boost/.NET/Python/Java и /m в Ruby) для . для соответствия любому char, включая новую строку.
Заметка обратной смены. На языках, где вы должны объявлять шаблоны со строками C, позволяющими escape-последовательности (например, \n для новой строки), вам нужно удвоить обратную косую черту, ускользающую от специальных символов, чтобы движок может относиться к ним как к буквальным символам (например, в Java, world\. будет объявлен как "world\\." или использовать класс символов: "world[.]"). Используйте строковые литералы строки (Python r'\bworld\b'), строковые литералы строки С# @"world\." или slashy строки/регулярные выражения, например /world\./.
Ответ 4
Просто сопоставьте /^index\.php/, затем отклоните все, что соответствует ему.
Ответ 5
В python:
>>> import re
>>> p='^(?!index\.php\?[0-9]+).*$'
>>> s1='index.php?12345'
>>> re.match(p,s1)
>>> s2='index.html?12345'
>>> re.match(p,s2)
<_sre.SRE_Match object at 0xb7d65fa8>
Ответ 6
Мне нужно регулярное выражение, способное сопоставить все, кроме строки, начинающейся с
index.phpопределенного шаблона (в частности, index.php и далее, например, index.php? Id = 2342343)
Используйте метод Exec
let match,
arr = [],
myRe = /([\s\S]+?)(?:index\.php\?id.+)/g;
var str = 'http://regular-viragenia/index.php?id=2342343';
while ((match = myRe.exec(str)) != null) {
arr.push(match[1]);
}
console.log(arr); Ответ 7
grep -v в оболочке
! ~ в perl
Пожалуйста, добавьте больше на другие языки - я отметил это как Community Wiki.
Ответ 8
Как не использовать регулярное выражение:
// In PHP
0 !== strpos($string, 'index.php')