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.