2016-04-14 25 views
0

Java'daki bir dizeden bir desenin ilk oluşumunu kaldırmaya çalışıyorum.Regex deseniyle ilgili sorunlar

Kaynak dizesi: DUMMY01012016DUMMY01012016

Biçim alfa-numerics herhangi bir sayıda ardından bir tarihe MMddyyyy ardından 1-8 alfa-sayısal karakterdir.

Kazanmaya çalışıyorum, ilk tarih oluşumunu da içeren tüm başlangıç ​​karakterlerini kaldırın. Yani aşağıdaki örnekte DUMMY01012016 ile bırakılacaktır. Desen kereden fazla eşleşti kadar iyi çalışır ".*\\d{4}(2016|2017|2015)"

: Burada

ne denedim basitleştirilmiş bir versiyonudur. Bu nedenle, örnekte matcher.replaceFirst(""), yalnızca ilk oluşumu değil, tüm kaynak dizesini değiştirecektir.

Herhangi bir düşünce büyük takdir edilecektir.

Teşekkürler. Stephan

+0

'. \ D {4} (2016 | 2017 | 2015).?' Deseninizi nasıl eşleştiriyor? _1-8 alfanümerik karakterlerin formatına göre bir tarih ve ardından herhangi bir alfa-numerics sayısı ile takip edilen bir MMddyyyy biçimine göre değil mi? –

+0

Olası kopyası [İntiks kullanarak bir dizgede bir dizinin indeksini alın] (http://stackoverflow.com/questions/8938498/get-the-index-of-a-pattern-in-a-string-using- regex) – flakes

+0

"Alfasayısal karakterler" ile aslında * alfabetik * karakterleri, yani harfleri mi kastediyorsunuz? "Alfasayısal" basamakları içerir. –

cevap

0

Bu regex çalışması gerekir: Sorunlarınızın

(\w{1,8}?\d{8})(?:\1) 
0

Bir .*açgözlü olmasıdır. İlk başta olabildiğince çok eşleştiği anlamına gelir. Daha sonra regexp motoru, tam bir eşleşme bulunana kadar sembolü sembol geri çekmeye başlar. kabaca

Yani,: 1) .*

DUMMY01012016DUMMY01012016 bütün Adım 2 macthes

Adım) motor kalan kısmını maç çalışıyor sembolle sembol geri adım: ->DUMMY01012016DUMMY010120 ->DUMMY01012016DUMMY01012 DUMMY01012016DUMMY0101201 - > .. ->DUMMY01012016DUMMY

Adım 3) tam bir eşleşme bulunduğunda ->DUMMY01012016DUMMY01012016

Böyle bir şey deneyebilirsiniz:

@Test 
public void testReplace() 
{ 
    String string = "DUMMY01012016DUMMY01012016"; 

    String replaced = string.replaceFirst("\\w{1,8}\\d{4}(2016|2017|2015)", ""); 

    Assert.assertEquals("DUMMY01012016", replaced); 
} 

tembel ve denemeler yapma ve bir soru işareti ? ekleyerek tembel yıldız yapabilir açgözlü arasındaki farkı anlamak için, örneğin. .*?\d{4}(2016|2017|2015). Daha sonra motor tersini yapacaktır, başlangıçta tembelce ve karaktere göre adım adım karakter olacaktır.

1

Sorununuz, * niceleyicinin açgözlü olmasıdır. Önceki alt-şablonun, genel eşleşmenin başarısız olmasına neden olmadan mümkün olduğunca çok eşleşmesine neden olacaktır (eğer bir eşleşme mümkün ise). Böylece, deseninizin .*\d{4}(2016|2017|2015) kuyruğundaki kuyruğu, dizideki bir tarihin son gerçekleşmesiyle eşleşir, oysa ilkiyle eşleşmesini istersiniz.

Bunun yerine "isteksiz" nicelik geçerek bu sorunu çözebilir

: Orada

myString.replaceFirst(".*?\d{4}(2016|2017|2015)", ""); 

, *? gönülsüz nicelik şudur: Yukarıdaki alt desen sıfır veya daha fazla örneği maçları, birkaç olarak Genel bir eşleşmeyi etkinleştirmek için mümkün olduğunca (eğer genel bir eşleşme mümkün ise).