2010-03-05 17 views
8

Bu, muhtemelen hızlıdır. Bu kod neden bir şey döndürmüyor? Bir sonraki belirteç deseni eşleşirseJava: bir desen için tarama dizesi

import java.util.Scanner; 

public class MainClass { 

public static void main(String[] args) { 
    try { 

     Scanner sc = new Scanner("asda ASA adad"); 
     String pattern = "[A-Z]+"; 

     while ((sc.hasNext(pattern))) { 

      System.out.println(sc.next(pattern)); 
     } 
     sc.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
} 

cevap

15

hasNext(String pattern) sadece true döndürür. Durumunuzda, "asda" sonraki belirteçtir ve bu "[A-Z]+" ile eşleşmez. Dokümantasyon, "[tarayıcı] herhangi bir girişi geçmiyor" şeklinde açık.

Eğer "[A-Za-z]+" için desen değiştirirseniz, o zaman ne amaçladığınız olabilir üç belirteçleri, iyi olur.

aslında sadece "[A-Z]+" maç belirteçleri almak istiyorsanız, o zaman herhangi birini yapabilirsiniz şunlardır:

  • basitçe sonra basitçe çağırmak, eşleşmeyen belirteçleri
  • useDelimiter("[^A-Z]+") atmak next()
  • kullanmak skip("[^A-Z]+")
  • kullanım findInLine("[A-Z]+")

İpucu: performans çok kritikse, bu yöntemlerin önceden derlenmiş Pattern aşırı yüklemelerini kullanmak istersiniz.

İpucu: "Xooo ABC" iki "[A-Z]+" eşleşmeye sahip olduğunu akılda tutmak yoktur. Eğer istediğin bu değilse, regex biraz daha karmaşık olmalı. Ya da her zaman eşleşen olmayan belirteçleri atabilirsiniz.

0

Değişim

String pattern = "[A-Z]+"; 

Eğer güvenli olmasını isteyebilirsiniz sınırlayıcı çevrili tüm kelimeleri yazdırmak ve tamamen desen dışlamak isteyen varsa

String pattern = "[a-zA-Z]+"; 
0

için. Bu şekilde, deseninizde olmayan bir karakteri içeren bir kelimeye rastlamazsınız. Bu, programınızın bu döngüden çıkmasına neden olur (şu anda yaptığı gibi).

while ((sc.hasNext())) { 

     System.out.println(sc.next()); 
    } 
Örneğin: