Normal ifade İki dize arasındaki tüm karakterleri eşleştir


434

Örnek: "Bu sadece basit bir cümledir".

"Bu" ve "cümle" arasındaki her karakteri eşleştirmek istiyorum. Satır kesmeleri yoksayılmalıdır. Doğru sözdizimini bulamıyorum.


11
Regex'i hangi ortamda kullandığınızı belirtmek isteyebilirsiniz. Satır sonlarını "yoksay" ile tam olarak ne demek istediğinize bağlı olarak farklılıklar olabilir.
Andrew Barber

Yanıtlar:


646

Örneğin

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

Regexr

"Bu" ve "cümle" nin maçta yer almaması için (?<=)ileriye baktım ve ileriye baktım (?=), ancak bu sizin kullanım durumunuza bağlı, sadece yazabilirsiniz This is(.*)sentence.

Burada önemli olan, regex motorunuzun "dotall" modunu etkinleştirmeniz ve böylece .yeni satır ile eşleşmesidir. Ancak bunu nasıl yapacağınız regex motorunuza bağlıdır.

Bir sonraki şey .*veya kullanırsanız .*?. Birincisi açgözlüdür ve dizenizdeki son "cümle" ye, ikincisi tembeldir ve dizenizdeki bir sonraki "cümle" ye kadar eşleşir.

Güncelleme

Regexr

This is(?s)(.*)sentence

Nerede (? S) dotall değiştiricisini açar .ve yeni satır karakterlerini eşleştirir.

Güncelleme 2:

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

"Bu (basit) bir cümle" örneğinizle eşleşiyor. Buraya Regexr bakın


@tchrist, üzgünüm bunu aramak zorunda kaldım. Bunu doğru anladım ve This is(?s)(.*)sentenceişe yarar mı?
stema

@stema: Evet, çoğu regex kütüphanesinde "hepsini noktala" modunu etkinleştirmek için çalışmalıdır.
tchrist

1
Bu çoğunlukla sorunumu çözdü, ancak desenime boşluk karakteri nasıl ekleyebilirim? Ben bir denemenin sonunda ")" eşleştirmek için "(. *?) ())" Denedim, ama işe yaramadı.
0xbadf00d

28
Sadece bir not - regexr şimdi javascript'te lookbehind desteklenmediğini söylüyor
Kovo

2
Bir metin bloğunda bu bölünmenin tekrarlanan örnekleriyle başa çıkmanın bir yolu var mı? Örneğin: "Bu sadece basit bir cümledir. İşte bazı ek şeyler. Bu sadece basit bir cümle. Ve işte bazı şeyler. Bu sadece basit bir cümle." Şu anda her örnek yerine tüm dizeyle eşleşiyor.
jzadra

181

Tembel Sayısallaştırıcı Gerekli

Kabul edilen cevaptaki normal ifade benim için pek doğru görünmediği için bu soruyu yeniden canlandırmak. Neden? Çünkü

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

eşleşir my first sentence. This is my secondiçindeThis is my first sentence. This is my second sentence.

Demoya bakınız .

İki bakış açısı arasında tembel bir niceleyiciye ihtiyacınız vardır. Bir ekleme ?yıldızı tembel yapar.

Bu, istediğinizle eşleşir:

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

Demoya bakınız . Gerekli olmayan yakalama grubunu kaldırdım.

Satır Kesmeleriyle Eşleşecek DOTALL Modu

Demoda "nokta, satır sonları moduyla eşleşiyor" (aka) nokta-all ayarlandığını unutmayın ( çeşitli dillerde DOTALL'u nasıl açacağınıza bakın ). Birçok normal (?s)ifade aromasında, ifadeyi dönüştürerek çevrimiçi değiştiriciyle ayarlayabilirsiniz :

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

Referans


Yakalama grubu hakkında haklısınız. Bunu neden yaptığımı bilmiyorum. Ama arasındaki fark .*ve .*?aynı zamanda benim cevap ( "Güncelleme" önce paragrafta) açıklanmıştır. Bu yüzden cevabımın yanlış olduğunu düşünmüyorum.
stema

2
@stema Nitpicking için özür dilerim, dün cevaplarından bazılarını seyrederken beni seğirtti. :) Ben ilk satırı yumuşatılmış is incorrectiçin doesn't seem quite correct to me... yapmaz Hope sen seğirme, böyle bir yüksek trafik cevap regex ne olması gerektiği konusunda algının muhtemelen sadece bir fark.
zx81

39

Deneyin This is[\s\S]*sentence, javascript ile çalışır


bu şekilde tembel bir arama nasıl yapılır?
AGamePlayer

4
@AQQiruiGuo yukarıdaki ile aynı. [\s\S]*?(ayrıca: açgözlü olmayan joker karakter)
phil294


13

bunu kullan: (?<=beginningstringname)(.*\n?)(?=endstringname)


Neden tüm yukarı oyları bilmiyorum, bu 0-1 satır sonlarına izin verir ve satır sonu hemen önce olmalıdırendstringname
OGHaza

Günlük satırlarının başlangıcını kaldırmayı yararlı buldum (zaman damgası vb.). Başlangıç ​​dizesi için yeni satır ve bitiş dizesi için "at" kullandım.
Stan

2

Herkes bir Jenkins bağlamında bunun bir örneğini arıyor olması durumunda. Build.log öğesini ayrıştırır ve bir eşleşme bulursa, derleme ile eşleşme başarısız olur.

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)
        }
    }
}


1

Bu benim için çalıştı ( VS Kodu kullanıyorum ):

için: This is just\na simple sentence

kullanın: This .+ sentence


0

Yüce Metin 3x

Yüce metinde, sadece ilgilendiğiniz iki kelimeyi yazın, örneğin sizin durumunuzda

"Bu" ve "cümle"

ve sen yazarsın.

yani This is .* sentence

ve bu seni iyi yapmalı


Sorunun Sublime Text'de nasıl yapılacağı ile ilgili olduğundan emin değilim ancak çoğunlukla Sublime Text'de çalışıyor. "Bu" ve "cümle" arasında bir çizgi oluştuğunda çalışmaz. Ayrıca, yüce metin, yalnızca bu iki dize arasındaki metin yerine "Bu" ve "Cümle" yi de seçer .
Dylan Kinnett

0

İşte böyle yaptım:
Bu benim için gerekli olan normal regex'i anlamaya çalışmaktan daha kolaydı.

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

0

VIM'de hızlı arama için Vim Kontrol isteminde kullanabilirsiniz: / Bu. * \ _. * cümle


0

Bu yazım dizesini Python2 ile Python2 için eski komut dosyalarında Python2'de dönüştürmek için regex aramamda indim: Python3 için. İyi çalışır, aksi takdirde ek dönüşümler için 2to3.py kullanın. İşte diğerleri için benim çözüm:

Regexr.com'da deneyin (herhangi bir nedenle NP ++ ile çalışmaz):

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

değişkenler için:

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

etiket ve değişken için:

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

Python2 içindeki tüm yazdırma "dizesi" Python3 için print ("string") ile nasıl değiştirilir?


0

RegEx, Java yaklaşımını kullanarak iki dize arasındaki her şeyi eşleştirecek.

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

RegEx (. ?) * Kullanmak için Pattern ve Matcher nesnelerini kullanalım .

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

Eşleştirici birden fazla eşleşme içerebileceğinden, sonuçların üzerinden geçmeli ve kaydetmeliyiz.

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

Bu örnek yalnızca "kaydeder" kelimesini içerecektir , ancak daha büyük metinde muhtemelen daha fazla eşleşme bulacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.