Regex: сопоставить все, кроме определенного шаблона

Мне нужно регулярное выражение, способное сопоставить все , но строку, начинающуюся с определенного шаблона (в частности index.php и следующего, как index.php?id=2342343)

Ответы

Ответ 1

Не эксперт по регулярному выражению, но я думаю, что с самого начала можно было бы использовать негативный взгляд. ^(?!foo).*$ не должно соответствовать чему-либо, начиная с foo.

Ответ 2

Вы можете поместить ^ в начале набора символов, чтобы оно соответствовало чему-либо, кроме этих символов.

[^=]*

будет соответствовать всем, кроме =

Ответ 3

Regex: соответствие всем , но:

Демонстрационная заметка: новая строка \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')