Potrzebuję wyrażenia regularnego zdolnego do dopasowania wszystkiego oprócz łańcucha rozpoczynającego się od określonego wzorca (konkretnie index.php
i tego, co następuje, jak index.php?id=2342343
)
Potrzebuję wyrażenia regularnego zdolnego do dopasowania wszystkiego oprócz łańcucha rozpoczynającego się od określonego wzorca (konkretnie index.php
i tego, co następuje, jak index.php?id=2342343
)
Odpowiedzi:
Nie jestem ekspertem od wyrażeń regularnych, ale myślę, że od samego początku możesz użyć negatywnego spojrzenia, np. ^(?!foo).*$
Nie powinieneś pasować do niczego, zaczynając od foo
.
^((?!foo).)*$
( stackoverflow.com/a/406408/3964381 )
Regex: dopasuj wszystko oprócz :
foo
):
world.
na końcu):
foo
) (brak patern zgodnych z POSIX, przepraszam):
|
symbol):
foo
):
cat
): /cat(*SKIP)(*FAIL)|[^c]*(?:c(?!at)[^c]*)*/i
lub/cat(*SKIP)(*FAIL)|(?:(?!cat).)+/is
(cat)|[^c]*(?:c(?!at)[^c]*)*
(lub (?s)(cat)|(?:(?!cat).)*
, lub (cat)|[^c]+(?:c(?!at)[^c]*)*|(?:c(?!at)[^c]*)+[^c]*
), a następnie sprawdzanie językowe oznacza: jeśli grupa 1 jest dopasowana, nie jest nam potrzebna, w przeciwnym razie, pobierz wartość dopasowania, jeśli nie jest pusta[^a-z]+
(dowolny znak inny niż mała litera ASCII)|
:[^|]+
Uwaga demonstracyjna : nowa linia \n
jest używana w negowanych klasach znaków w demonstracjach, aby uniknąć przepełnienia dopasowania do sąsiednich linii. Nie są one konieczne podczas testowania pojedynczych ciągów.
Uwaga kotwicy : W wielu językach użyj \A
do zdefiniowania jednoznacznego początku łańcucha, a \z
(w Pythonie jest to \Z
w JavaScript $
jest OK), aby zdefiniować sam koniec łańcucha.
Uwaga dot : W wielu smakach (ale nie POSIX, TRE, TCL), .
pasuje do dowolnego znaku, ale znak nowego wiersza . Upewnij się, że używasz odpowiedniego modyfikatora DOTALL ( /s
w PCRE / Boost / .NET / Python / Java i /m
Ruby), .
aby dopasować dowolny znak, w tym nowy wiersz.
Backslash Uwaga : W językach, gdzie trzeba zadeklarować wzory z ciągów C pozwalających sekwencje (jak \n
dla nowej linii), trzeba podwoić backslashy uciekających tak specjalne znaki, że silnik mógłby traktować je jako znaki dosłowne (na przykład w Javie, world\.
będzie zadeklarowane jako "world\\."
lub użyj klasy znaków:) "world[.]"
. Używaj nieprzetworzonych literałów łańcuchowych (Python r'\bworld\b'
), dosłownych literałów łańcuchowych C # @"world\."
lub ukośnych ciągów znaków / wyrażeń regularnych, takich jak /world\./
.
^(?!foo$)
, dlaczego znak dolara musi znajdować się w nawiasach, aby wyrażenie działało? Spodziewałem ^(?!foo)$
się dać te same wyniki, ale tak nie jest.
$
kotwica znajduje się wewnątrz anteny, jest to część warunku, część tego stwierdzenia o zerowej szerokości . Gdyby znajdował się na zewnątrz, jak w ^(?!foo)$
, będzie częścią wzorca konsumpcji wymagającego końca łańcucha zaraz po rozpoczęciu łańcucha, co sprawi, że negatywne spojrzenie w przód nie będzie miało znaczenia, ponieważ zawsze zwróci prawdę (nie może być tekstu po końcu łańcucha , nie mówiąc już foo
). Tak więc ^(?!foo$)
dopasowuje początek łańcucha, który nie jest śledzony foo
, po którym następuje koniec łańcucha. ^(?!foo)$
dopasowuje pusty ciąg.
cot
lub lan
i usunąć dopasowanie, jak regex.replace(myString, "^.*?(?:cot|lan)\s*", "")
.
Możesz umieścić a ^
na początku zestawu znaków, aby dopasować wszystko oprócz tych znaków.
[^=]*
dopasuje wszystko oprócz =
Po prostu dopasuj, /^index\.php/
a następnie odrzuć wszystko, co pasuje.
str !~ /\Aindex\.php/
.
Potrzebuję regex stanie dopasować wszystko, ale except się ciąg rozpoczynający się od
index.php
określonego wzoru (konkretnie index.php a co za tym idzie, jak index.php? Id = 2342343)
Użyj metody 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]);
LUB INNE MECZE
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);
Może nie użyjesz wyrażenia regularnego:
// In PHP
0 !== strpos($string, 'index.php')
grep
W wierszu poleceń, Perl / Python / w dowolnym innym języku lub w poleceniu „Wykonaj wyrażenie regularne dla każdej linii” w edytorze tekstów itp.)