Ho bisogno di un regex in grado di abbinare tutto tranne una stringa che inizia con uno schema specifico (in particolare index.php
e ciò che segue, come index.php?id=2342343
)
Ho bisogno di un regex in grado di abbinare tutto tranne una stringa che inizia con uno schema specifico (in particolare index.php
e ciò che segue, come index.php?id=2342343
)
Risposte:
Non sono un esperto di regexp, ma penso che potresti usare un lookahead negativo dall'inizio, ad es. ^(?!foo).*$
Non dovresti abbinare nulla con cui iniziare foo
.
^((?!foo).)*$
( stackoverflow.com/a/406408/3964381 )
Regex: abbina tutto ma :
foo
):
world.
alla fine):
foo
) (nessuna patern conforme a POSIX, scusa):
|
simbolo):
foo
):
cat
): /cat(*SKIP)(*FAIL)|[^c]*(?:c(?!at)[^c]*)*/i
o/cat(*SKIP)(*FAIL)|(?:(?!cat).)+/is
(cat)|[^c]*(?:c(?!at)[^c]*)*
(o (?s)(cat)|(?:(?!cat).)*
, o (cat)|[^c]+(?:c(?!at)[^c]*)*|(?:c(?!at)[^c]*)+[^c]*
) e quindi verificare con la lingua significa: se il Gruppo 1 corrisponde, non è quello di cui abbiamo bisogno, altrimenti, prendi il valore della corrispondenza se non vuoto[^a-z]+
(qualsiasi carattere diverso da una lettera ASCII minuscola)|
:[^|]+
Nota dimostrativa : la nuova riga \n
viene utilizzata all'interno delle classi di caratteri negati nelle demo per evitare l'overflow della corrispondenza con le linee vicine. Non sono necessari durante il test di singole stringhe.
Nota di ancoraggio : in molte lingue, utilizzare \A
per definire l'inizio non ambiguo della stringa e \z
(in Python, è \Z
, in JavaScript, $
è OK) per definire la fine della stringa.
Nota a punti : in molti gusti (ma non POSIX, TRE, TCL), .
corrisponde a qualsiasi carattere ma a un carattere newline . Assicurati di usare un modificatore DOTALL corrispondente ( /s
in PCRE / Boost / .NET / Python / Java e /m
in Ruby) per .
far corrispondere qualsiasi carattere incluso un newline.
Nota sulla barra rovesciata : nelle lingue in cui è necessario dichiarare modelli con stringhe C che consentono sequenze di escape (come \n
per una nuova riga), è necessario raddoppiare le barre rovesciate sfuggendo a caratteri speciali in modo che il motore possa trattarli come caratteri letterali (ad esempio in Java, world\.
sarà dichiarato come "world\\."
o utilizzare una classe di caratteri:) "world[.]"
. Usa valori letterali di stringa grezzi (Python r'\bworld\b'
), valori letterali di stringa verbali C # @"world\."
o stringhe slashy / notazioni letterali regex come /world\./
.
^(?!foo$)
, perché il simbolo del dollaro deve essere tra parentesi affinché l'espressione funzioni? Mi aspettavo ^(?!foo)$
di dare gli stessi risultati, ma non lo è.
$
ancora si trova all'interno del lookahead, fa parte della condizione, parte di quell'asserzione di larghezza zero . Se fosse esterno, come in ^(?!foo)$
, farà parte del modello di consumo che richiede la fine della stringa subito dopo l'inizio della stringa, rendendo il lookahead negativo irrilevante poiché restituirebbe sempre true (non può esserci testo dopo la fine della stringa , figuriamoci foo
). Pertanto, l' ^(?!foo$)
inizio delle corrispondenze di una stringa non seguita da foo
quella seguita dalla fine della stringa. ^(?!foo)$
corrisponde a una stringa vuota.
cot
o lan
, e rimuovere la corrispondenza, come regex.replace(myString, "^.*?(?:cot|lan)\s*", "")
.
Puoi inserire ^
a all'inizio di un set di caratteri per abbinare qualsiasi cosa tranne quei personaggi.
[^=]*
corrisponderà a tutto ma =
Basta abbinare /^index\.php/
quindi respingere qualsiasi cosa corrisponda.
str !~ /\Aindex\.php/
.
Ho bisogno di un regex in grado di abbinare tutto ma tranne una stringa che inizia con
index.php
uno schema specifico (in particolare index.php e ciò che segue, come index.php? Id = 2342343)
Usa il metodo 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]);
O ALTRE PARTITE
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);
Che ne dici di non usare regex:
// In PHP
0 !== strpos($string, 'index.php')
grep
la riga di comando, ad esempio, o Perl / Python / qualsiasi altra lingua o un comando "Esegui questa regex per ogni riga" in un editor di testo, ecc ...)