Normal ifade operatörü değil


125

Normal ifadelerde bir DEĞİL operatörü var mı? Şu dizedeki gibi:"(2001) (asdf) (dasd1123_asd 21.01.2011 zqge)(dzqge) name (20019)"

Bütün silmek istiyor \([0-9a-zA-z _\.\-:]*\)ama bir yıl biri: (2001).

Dönmelidir regex ne olmalıdır Yani: (2001) name.

NOT: \((?![\d]){4}[0-9a-zA-z _\.\-:]*\)Benim için işe yaramıyor gibi bir şey (bir (20019)şekilde eşleşiyor ...)


1
Orada yukarıdaki gibi bir dize ve ben regex sonucu olduğunu, o kadar regex istiyorum: (2001) name.
— Sonnenhut

Yanıtlar:


119

Hayır, direkt olmayan operatör yok. En azından umduğun şekilde değil.

Sıfır genişlikte bir negatif önden okuma kullanabilirsiniz, ancak:

\((?!2001)[0-9a-zA-z _\.\-:]*\)

(?!...)Metin eğer bölüm araçları "sadece maç izleyen bu: (lookahead dolayısıyla) gelmez (dolayısıyla: negatif). Bu maç Ama aslında değil tüketmek eşleştiği karakterleri (dolayısıyla: sıfır genişlik).

Aslında 2 eksenli 4 görünüm kombinasyonu vardır :

  • lookbehind / lookahead: noktadan önceki veya sonraki karakterlerin dikkate alınacağını belirtir
  • Pozitif / Negatif: belirtir karakterler eğer gerekir eşleşmesi veya olmamalıdır maç.

Teşekkür ederim! benim de önerdiğim buydu, ama yine de kullanırsam \((?![\d]{4})[0-9a-zA-z _\.\-:]+\)hala (20019)içinde var
— Sonnenhut

Sorunuzun düzenlenmesi sırasında {4} dıştan bakış açısını koyarsınız ve bu yorumda da içine koyarsınız : hangisini denediniz? Ayrıca: İstersen (20019)maç için, ardından eklemek gerekir \) içeride sizin lookahead:\((?![\d]{4}\))[0-9a-zA-z _\.\-:]+\)
— Joachim Sauer

Yorumunuzda yukarıdaki normal ifade ile işe yarıyor. Ama anlamıyorum ... Sonraki kısımdan niye kaçıyorsun anlamıyorum \((?![\d]{4} -->\)<--)[0-9a-zA-z _\.\-:]+\)O zaman kapatılmamış bir parantez var, değil mi?
— Sonnenhut

Kapanış parantezinden kaçıyorum )çünkü gerçek karakteri eşleştirmek istiyorum )(tıpkı normal ifadenizin en başında ve en sonunda yaptığınız gibi!). Sonra sonra bunu eşleşti, ben bir çıkmamış kullanarak lookahead sona ).
— Joachim Sauer

Anladım. Tüm bu karakterler beni biraz karıştırdı. Teşekkür ederim.
— Sonnenhut

198

Tam olarak değil, ancak genellikle formlardan birinde bazı geçici çözümler kullanabilirsiniz.

  • [^abc], karakter karakter olan aveya değil bveya c,
  • veya olumsuz, ileriye: a(?!b), bir atakip değilb
  • ya da negatif Geriye dönük: (?<!a)b, olduğu b, başında değila

: - (?! <A) referans Evet, ben negatif olan ileriye dönük b düşünüyorum regular-expressions.info/lookaround.html
— jankins

10
Ama [^abc]olmadığını belki aya bya c, değil "dize abc".
— Raining

0

Parçayı yakalayabilir (2001)ve geri kalanını hiçbir şey olmadan değiştirebilirsiniz.

public static string extractYearString(string input) {
    return input.replaceAll(".*\(([0-9]{4})\).*", "$1");
}

var subject = "(2001) (asdf) (dasd1123_asd 21.01.2011 zqge)(dzqge) name (20019)";
var result = extractYearString(subject);
System.out.println(result); // <-- "2001"

.*\(([0-9]{4})\).* anlamına geliyor

  • .* herhangi bir şeyle eşleş
  • \(bir (karakterle eşleş
  • ( yakalamaya başla
  • [0-9]{4} herhangi bir tek haneli dört kez
  • ) yakalama sonu
  • \)bir )karakterle eşleş
  • .* herhangi bir şey (dizenin geri kalanı)
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.