Ekspresi reguler: Apakah ada aplikasi DAN operator?

Jelas, anda dapat menggunakan | (pipa?) untuk mewakili ATAU, tapi apakah ada cara untuk mewakili DAN juga?

Secara khusus, saya'd seperti untuk pertandingan paragraf teks yang berisi SEMUA frase tertentu, tetapi tidak dalam urutan tertentu.

Mengomentari pertanyaan (4)

Menggunakan non-mengkonsumsi ekspresi reguler.

Khas (yaitu Perl/Jawa) notasi:

(?=expr)

Ini berarti "pertandingan expr tapi setelah itu melanjutkan cocok di pertandingan yang asli-titik."

Anda dapat melakukan lebih banyak dari ini seperti yang anda inginkan, dan ini akan menjadi sebuah "dan." Contoh:

(?=pertandingan ini ekspresi)(?=pertandingan ini juga)(?=oh, dan ini)

Anda bahkan dapat menambahkan menangkap kelompok-kelompok di dalam kamar non-mengkonsumsi ekspresi jika anda perlu untuk menyimpan beberapa data di dalamnya.

Komentar (14)

Anda perlu menggunakan lookahead seperti beberapa responden mengatakan, tapi lookahead harus memperhitungkan karakter lainnya antara target kata dan pertandingan saat posisi. Misalnya:

(?=.*word1)(?=.*word2)(?=.*word3)

The .* pertama lookahead memungkinkan itu pertandingan namun banyak karakter yang dibutuhkan untuk sebelum sampai ke "word1". Kemudian mencocokkan posisi reset dan kedua lookahead berusaha keluar "word2". Ulang lagi, dan bagian akhir pertandingan "word3"; sejak's kata terakhir anda're memeriksa, isn't perlu bahwa itu berada di lookahead, tapi itu doesn't terluka.

Dalam rangka untuk mencocokkan seluruh paragraf, anda perlu untuk jangkar regex pada kedua ujungnya dan tambahkan final .* untuk mengkonsumsi karakter yang tersisa. Menggunakan Perl-gaya notasi, yang akan sama:

/^(?=.*word1)(?=.*word2)(?=.*word3).*$/m

The 'm' pengubah untuk multline mode; ini memungkinkan ^ dan $ pertandingan pada ayat batas ("garis batas" dalam regex-berbicara). It's penting dalam hal ini bahwa anda tidak **** gunakan 's' pengubah, yang memungkinkan dot metakarakter pertandingan baris serta semua karakter lainnya.

Akhirnya, anda ingin memastikan anda're pencocokan kata-kata secara keseluruhan dan tidak hanya fragmen dari kata-kata lagi, sehingga anda perlu menambahkan kata-batas:

/^(?=.*\bword1\b)(?=.*\bword2\b)(?=.*\bword3\b).*$/m
Komentar (7)

Lihat contoh ini:

Kami memiliki 2 regexps A dan B dan kita ingin pertandingan kedua mereka, sehingga dalam pseudo-code ini terlihat seperti ini:

pattern = "/A AND B/"

Hal ini dapat ditulis tanpa menggunakan operator AND seperti ini:

pattern = "/NOT (NOT A OR NOT B)/"

di PCRE:

"/(^(^A|^B))/"

regexp_match(pattern,data)
Komentar (8)

Anda dapat melakukan itu dengan ekspresi reguler tapi mungkin anda'll ingin beberapa yang lain. Misalnya menggunakan beberapa regexp dan menggabungkan mereka dalam if clause.

Anda dapat menghitung semua kemungkinan permutasi dengan standar regexp, seperti ini (pertandingan a, b dan c dalam urutan apapun):

(abc)|(bca)|(acb)|(bac)|(cab)|(cba)

Namun, hal ini membuat sangat panjang dan mungkin tidak efisien regexp, jika anda memiliki lebih dari beberapa hal.

Jika anda menggunakan beberapa diperpanjang regexp versi, seperti Perl's atau Java's, mereka memiliki cara yang lebih baik untuk melakukan hal ini. Jawaban yang lain telah menyarankan menggunakan positif lookahead operasi.

Komentar (1)

DAN operator implisit di RegExp sintaks.
Operator OR malah akan ditentukan dengan pipa.
Berikut RegExp:

var re = /ab/;

berarti huruf a DAN huruf b.
Ia juga bekerja dengan kelompok-kelompok:

var re = /(co)(de)/;

itu berarti kelompok co DAN kelompok de.
Mengganti (implisit) DAN dengan ATAU akan memerlukan baris berikut:

var re = /a|b/;
var re = /(co)|(de)/;
Komentar (3)

Itu tidak mungkin dalam kasus anda untuk melakukan DAN pada beberapa hasil yang cocok? dalam pseudocode

regexp_match(pattern1, data) && regexp_match(pattern2, data) && ...
Komentar (1)

Mengapa tidak menggunakan awk?
dengan awk regex DAN, ATAU hal-hal yang sangat sederhana

awk '/WORD1/ && /WORD2/ && /WORD3/' myfile
Komentar (0)

Jika anda menggunakan Perl regular expressions, anda dapat menggunakan positif lookahead:

Misalnya

(?=[1-9][0-9]{2})[0-9]*[05]\b

akan menjadi angka yang lebih besar dari 100 dan habis dibagi oleh 5

Komentar (0)

Selain jawaban yang diterima

Saya akan memberikan anda dengan beberapa contoh praktis yang akan mendapatkan hal-hal yang lebih jelas untuk sebagian dari Anda. Misalnya katakanlah kita memiliki tiga baris teks:

[12/Oct/2015:00:37:29 +0200] // only this + will get selected
[12/Oct/2015:00:37:x9 +0200]
[12/Oct/2015:00:37:29 +020x]

Lihat demo di sini [DEMO][1]

Apa yang ingin kita lakukan di sini adalah untuk memilih tanda + tetapi hanya jika itu's setelah dua angka dengan ruang dan jika itu's sebelum empat angka. Mereka adalah satu-satunya kendala. Kita akan menggunakan ekspresi reguler untuk mencapai hal ini:


'~(?
Komentar (1)

Anda bisa pipa output lain regex. Menggunakan grep, anda bisa melakukan hal ini:

grep A | grep B

Komentar (0)

Order selalu tersirat dalam struktur dari ekspresi reguler. Untuk mencapai apa yang anda inginkan, anda'akan memiliki untuk mencocokkan string masukan beberapa kali terhadap ekspresi yang berbeda.

Apa yang ingin anda lakukan adalah tidak mungkin dengan satu regexp.

Komentar (2)

Gunakan DAN di luar ekspresi reguler. Di PHP lookahead operator tidak tampaknya tidak bekerja untuk saya, bukan saya menggunakan ini

if( preg_match("/^.{3,}$/",$pass1) && !preg_match("/\s{1}/",$pass1))
    return true;
else
    return false;

Di atas regex akan cocok jika password dengan panjang 3 karakter atau lebih dan tidak ada spasi di password.

Komentar (0)