Мне нужно регулярное выражение, способное сопоставить все, кроме строки, начиная с определенного шаблона (конкретно, index.php
и что следует, например index.php?id=2342343
)
Мне нужно регулярное выражение, способное сопоставить все, кроме строки, начиная с определенного шаблона (конкретно, index.php
и что следует, например index.php?id=2342343
)
Ответы:
Не эксперт по регулярным выражениям, но я думаю, что вы могли бы использовать отрицательный прогноз с самого начала, например, ^(?!foo).*$
не должен совпадать с чем-либо, начиная с foo
.
^((?!foo).)*$
( stackoverflow.com/a/406408/3964381 )
Regex: соответствует всем, кроме :
foo
):
world.
в конце):
foo
) (не соответствует лаковой POSIX, извините):
|
символ):
foo
):
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[.]"
. Использование сырья строковых литералов (Python r'\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/
.
Мне нужно регулярное выражение в состоянии соответствовать все , но за исключением того, в строку , начиная с
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);
var myRe = /([\s\S]+?)(?:index\.php\?id=.+)/g;
var str = 'http://regular-viragenia/index.php?id=2342343';
var matches_array = myRe.exec(str);
console.log(matches_array[1]);
ИЛИ ДРУГОЕ МАТЧ
let match,
arr = [],
myRe = /index.php\?id=((?:(?!index)[\s\S])*)/g;
var str = 'http://regular-viragenia/index.php?id=2342343index.php?id=111index.php?id=222';
while ((match = myRe.exec(str)) != null) {
arr.push(match[1]);
}
console.log(arr);
Как насчет не использовать регулярное выражение:
// In PHP
0 !== strpos($string, 'index.php')
grep
, например, в командной строке или Perl / Python / любой другой язык, или команду «Выполнить это регулярное выражение для каждой строки» в текстовом редакторе и т. Д ...)