Saya membutuhkan regex yang dapat mencocokkan semuanya kecuali string yang dimulai dengan pola tertentu (khusus index.php
dan apa yang mengikuti, seperti index.php?id=2342343
)
Saya membutuhkan regex yang dapat mencocokkan semuanya kecuali string yang dimulai dengan pola tertentu (khusus index.php
dan apa yang mengikuti, seperti index.php?id=2342343
)
Jawaban:
Bukan ahli regexp, tapi saya pikir Anda bisa menggunakan lookahead negatif dari awal, misalnya ^(?!foo).*$
tidak harus cocok dengan apa pun yang dimulai dengan foo
.
^((?!foo).)*$
( stackoverflow.com/a/406408/3964381 )
Regex: cocokkan semua kecuali :
foo
):
world.
di akhir):
foo
) (tidak ada POSIX compliant patern, maaf):
|
simbol):
foo
):
cat
): /cat(*SKIP)(*FAIL)|[^c]*(?:c(?!at)[^c]*)*/i
atau/cat(*SKIP)(*FAIL)|(?:(?!cat).)+/is
(cat)|[^c]*(?:c(?!at)[^c]*)*
(atau (?s)(cat)|(?:(?!cat).)*
, atau (cat)|[^c]+(?:c(?!at)[^c]*)*|(?:c(?!at)[^c]*)+[^c]*
) dan kemudian memeriksa dengan bahasa berarti: jika Grup 1 cocok, itu bukan yang kita butuhkan, atau ambil nilai kecocokan jika tidak kosong[^a-z]+
(karakter apa pun selain huruf ASCII huruf kecil)|
:[^|]+
Catatan demo : baris baru \n
digunakan di dalam kelas karakter yang dinegasikan dalam demo untuk menghindari kecocokan pencocokan dengan baris tetangga. Mereka tidak perlu saat menguji string individu.
Catatan jangkar : Dalam banyak bahasa, gunakan \A
untuk mendefinisikan awal string yang jelas, dan \z
(dalam Python \Z
, dalam JavaScript, $
adalah OK) untuk menentukan bagian paling akhir dari string.
Dot note : Dalam banyak rasa (tapi bukan POSIX, TRE, TCL), .
cocok dengan char apa pun kecuali char baris baru . Pastikan Anda menggunakan pengubah DOTALL yang sesuai ( /s
di PCRE / Boost / .NET / Python / Java dan /m
di Ruby) .
agar sesuai dengan karakter apa pun termasuk baris baru.
Catatan\n
garis miring terbalik : Dalam bahasa di mana Anda harus mendeklarasikan pola dengan string C yang memungkinkan urutan pelarian (seperti untuk baris baru), Anda perlu menggandakan garis miring terbalik yang keluar dari karakter khusus sehingga mesin dapat memperlakukan mereka sebagai karakter literal (misalnya di Jawa, world\.
akan menjadi dinyatakan sebagai "world\\."
, atau menggunakan kelas karakter:) "world[.]"
. Gunakan literal string mentah (Python r'\bworld\b'
), literal string C # verbatim @"world\."
, atau string slashy / regex notasi literal seperti /world\./
.
^(?!foo$)
, mengapa tanda dolar harus berada dalam tanda kurung agar ekspresi tersebut berfungsi? Saya mengharapkan ^(?!foo)$
untuk memberikan hasil yang sama, tetapi tidak.
$
jangkar berada di dalam lookahead, itu adalah bagian dari kondisi, bagian dari pernyataan lebar nol itu . Jika berada di luar, seperti di ^(?!foo)$
, itu akan menjadi bagian dari pola konsumsi yang membutuhkan akhir string tepat setelah awal string, membuat tampilan negatif tidak relevan karena akan selalu kembali benar (tidak ada teks setelah akhir string , apalagi foo
). Jadi, ^(?!foo$)
kecocokan mulai dari string yang tidak diikuti dengan foo
yang diikuti dengan akhir string. ^(?!foo)$
cocok dengan string kosong.
cot
atau lan
, dan menghapus kecocokan, seperti regex.replace(myString, "^.*?(?:cot|lan)\s*", "")
.
Anda dapat menempatkan a ^
di awal set karakter untuk mencocokkan apa pun kecuali karakter tersebut.
[^=]*
akan cocok dengan segalanya kecuali =
Cocokkan saja /^index\.php/
lalu tolak apa pun yang cocok dengannya.
str !~ /\Aindex\.php/
.
Aku butuh mampu regex untuk mencocokkan segalanya tapi kecuali sebuah string yang dimulai dengan
index.php
pola tertentu (khusus index.php dan apa yang berikut, seperti index.php? Id = 2.342.343)
Gunakan metode 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]);
ATAU PERTANDINGAN LAINNYA
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);
Bagaimana kalau tidak menggunakan regex:
// In PHP
0 !== strpos($string, 'index.php')
grep
pada command-line, misalnya, atau Perl / Python / bahasa lain, atau perintah "Jalankan regex ini untuk setiap baris" dalam editor teks, dll ...)