Мне нужно регулярное выражение, способное сопоставить все , но строку, начинающуюся с определенного шаблона (в частности 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')