Regex Cocokkan semua karakter antara dua string

436

Contoh: "Ini hanya kalimat sederhana".

Saya ingin mencocokkan setiap karakter antara "Ini" dan "kalimat". Jeda baris harus diabaikan. Saya tidak dapat menemukan sintaks yang benar.

0xbadf00d
sumber
11
Anda mungkin ingin menunjukkan lingkungan tempat Anda menggunakan Regex. Mungkin ada perbedaan tergantung pada apa yang Anda maksud dengan jeda baris "abaikan".
Andrew Barber

Jawaban:

647

Sebagai contoh

(?<=This is)(.*)(?=sentence)

Regexr

Saya menggunakan lookbehind (?<=)dan melihat ke depan (?=)sehingga "Ini" dan "kalimat" tidak termasuk dalam pertandingan, tetapi ini tergantung pada kasus penggunaan Anda, Anda juga dapat menulis This is(.*)sentence.

Yang penting di sini adalah Anda mengaktifkan mode "dotall" dari mesin regex Anda, sehingga .cocok dengan baris baru. Tetapi bagaimana Anda melakukan ini tergantung pada mesin regex Anda.

Hal berikutnya adalah apakah Anda menggunakan .*atau .*?. Yang pertama serakah dan akan cocok sampai "kalimat" terakhir di string Anda, yang kedua malas dan akan cocok sampai "kalimat" berikutnya di string Anda.

Memperbarui

Regexr

This is(?s)(.*)sentence

Di mana (? S) mengaktifkan pengubah dotall, membuat yang .cocok dengan karakter baris baru.

Pembaruan 2:

(?<=is \()(.*?)(?=\s*\))

cocok dengan contoh Anda "Ini kalimat (sederhana)". Lihat di sini di Regexr

stema
sumber
@tchrist, maaf aku harus mencari ini. Apakah saya memahami ini dengan benar dan This is(?s)(.*)sentenceakan berfungsi?
stema
@stema: Ya, itu seharusnya berfungsi untuk mengaktifkan mode "dot all" di sebagian besar pustaka regex.
tchrist
1
Itu sebagian besar memecahkan masalah saya, tetapi bagaimana saya memasukkan karakter spasi di pola saya? Saya mencoba yang berikut: "(. *?) ())" Untuk mencocokkan ")" di akhir urutan, tetapi tidak berhasil.
0xbadf00d
28
Hanya satu catatan - regexr mengatakan sekarang bahwa lookbehind tidak didukung dalam javascript
Kovo
2
Apakah ada cara untuk menangani contoh berulang dari perpecahan ini dalam satu blok teks? Misalnya: "Ini hanya kalimat sederhana. Ini adalah beberapa hal tambahan. Ini kalimat sederhana. Dan ada beberapa hal lagi. Ini hanya kalimat sederhana.". Saat ini cocok dengan seluruh string, bukan setiap contoh.
jzadra
182

Dibutuhkan Quantifier Malas

Menghidupkan kembali pertanyaan ini karena regex dalam jawaban yang diterima tampaknya tidak benar bagi saya. Mengapa? Karena

(?<=This is)(.*)(?=sentence)

akan cocok my first sentence. This is my seconddiThis is my first sentence. This is my second sentence.

Lihat demo .

Anda membutuhkan kuantifier malas di antara kedua lookaround. Menambahkan bintang ?membuat bintang malas.

Ini sesuai dengan yang Anda inginkan:

(?<=This is).*?(?=sentence)

Lihat demo . Saya menghapus grup penangkap, yang tidak diperlukan.

Mode DOTALL untuk Mencocokkan Lintas Batas

Perhatikan bahwa dalam demo "mode dot break line break" (alias) dot-all diatur (lihat cara mengaktifkan DOTALL dalam berbagai bahasa ). Dalam banyak rasa regex, Anda dapat mengaturnya dengan pengubah online (?s), mengubah ekspresi menjadi:

(?s)(?<=This is).*?(?=sentence)

Referensi

zx81
sumber
Anda benar tentang grup penangkap. Tidak tahu mengapa saya melakukan ini. Tetapi perbedaan antara .*dan .*?juga dijelaskan dalam jawaban saya (paragraf sebelum "Pembaruan"). Jadi saya tidak berpikir jawaban saya salah.
stema
2
@stema Maaf tentang nitpicking, sementara menjelajahi beberapa jawaban Anda kemarin itu adalah satu-satunya yang membuat saya berkedut. :) Saya melunakkan baris pertama dari is incorrectmenjadi doesn't seem quite correct to me... Harapan itu tidak membuat Anda berkedut, mungkin hanya perbedaan persepsi tentang apa yang seharusnya menjadi jawaban untuk lalu lintas tinggi seperti itu.
zx81
39

Coba This is[\s\S]*sentence, berfungsi dalam javascript

kaore
sumber
bagaimana cara melakukan pencarian malas dengan cara ini?
AGamePlayer
4
@AwQiruiGuo sama seperti di atas. [\s\S]*?(juga disebut: wildcard non-serakah)
phil294
16

Ini:

This is (.*?) sentence

bekerja di javascript.

Riyafa Abdul Hameed
sumber
13

Gunakan ini: (?<=beginningstringname)(.*\n?)(?=endstringname)

vignesh
sumber
Tidak tahu mengapa semua suara, ini memungkinkan untuk jeda 0-1, dan jeda harus segera sebelumendstringname
OGHaza
Saya merasa bermanfaat untuk menghapus awal baris log (timestamp dll). Saya menggunakan baris baru untuk string awal dan "at" untuk string akhir.
Stan
2

Jika ada yang mencari contoh ini dalam konteks Jenkins. Itu mem-parsing build.log dan jika menemukan kecocokan maka gagal membangun dengan pencocokan

import java.util.regex.Matcher;
import java.util.regex.Pattern;

node{    
    stage("parse"){
        def file = readFile 'build.log'

        def regex = ~"(?s)(firstStringToUse(.*)secondStringToUse)"
        Matcher match = regex.matcher(file)
        match.find() {
            capturedText = match.group(1)
            error(capturedText)
        }
    }
}
Cephos
sumber
1

Anda cukup menggunakan ini: \This is .*? \sentence

AnirbanDebnath
sumber
1

Ini bekerja untuk saya (saya menggunakan VS Code ):

untuk: This is just\na simple sentence

Menggunakan: This .+ sentence

Roshna Omer
sumber
0

Sublime Text 3x

Dalam teks luhur, Anda cukup menulis dua kata yang Anda minati, misalnya dalam kasus Anda

"Ini" dan "kalimat"

dan Anda menulis. * di antaranya

yaitu This is .* sentence

dan ini harus Anda lakukan dengan baik

rsc05
sumber
Tidak yakin pertanyaannya adalah tentang bagaimana melakukan ini dalam Sublime Text tetapi sebagian besar berfungsi di Sublime Text. Ini tidak berfungsi ketika ada garis pemisah antara "Ini" dan "kalimat". Selain itu, teks luhur juga memilih "Ini" dan "Kalimat" daripada hanya teks di antara dua string tersebut.
Dylan Kinnett
0

Inilah cara saya melakukannya:
Ini lebih mudah bagi saya daripada mencoba mencari tahu regex spesifik yang diperlukan.

int indexPictureData = result.IndexOf("-PictureData:");
int indexIdentity = result.IndexOf("-Identity:");
string returnValue = result.Remove(indexPictureData + 13);
returnValue = returnValue + " [bytecoderemoved] " + result.Remove(0, indexIdentity); ` 
Bbb
sumber
0

untuk pencarian cepat di VIM, Anda dapat menggunakan perintah Vim Control: / Ini kalimat. * \ _. *

anggur
sumber
0

Saya mendarat di sini pada pencarian saya untuk regex untuk mengkonversi sintaks cetak ini antara print "string", di Python2 dalam skrip lama dengan: print ("string"), untuk Python3. Berfungsi dengan baik, jika tidak gunakan 2to3.py untuk konversi tambahan. Inilah solusi saya untuk orang lain:

Cobalah di Regexr.com (tidak berfungsi di NP ++ karena alasan tertentu):

find:     (?<=print)( ')(.*)(')
replace: ('$2')

untuk variabel:

(?<=print)( )(.*)(\n)
('$2')\n

untuk label dan variabel:

(?<=print)( ')(.*)(',)(.*)(\n)
('$2',$4)\n

Bagaimana cara mengganti semua cetak "string" di Python2 dengan print ("string") untuk Python3?

alkimia
sumber
0

RegEx untuk mencocokkan semuanya antara dua string menggunakan pendekatan Java.

List<String> results = new ArrayList<>(); //For storing results
String example = "Code will save the world";

Mari kita gunakan objek Pattern and Matcher untuk menggunakan RegEx (. ?) * .

Pattern p = Pattern.compile("Code "(.*?)" world");   //java.util.regex.Pattern;
Matcher m = p.matcher(example);                      //java.util.regex.Matcher;

Karena Matcher mungkin berisi lebih dari satu pertandingan, kita perlu mengulang hasilnya dan menyimpannya.

while(m.find()){   //Loop through all matches
   results.add(m.group()); //Get value and store in collection.
}

Contoh ini hanya akan berisi kata "akan menyimpan" , tetapi dalam teks yang lebih besar mungkin akan menemukan lebih banyak kecocokan.

Alexander
sumber