2009-07-26 5 views
1

Quelqu'un me aider j'ai un fichier contenant suivantchaîne lue regex matcher.matches première chaîne correspond pas correctement

a      // true 
тодорхойгүй гишүүн\n // false 
ямар нэг    // false 
нэгэн     // false 
a good deal    // true 
нэлээн     // false 
a long face    // true 
уруу царай    // false 
... 

Mon code java

while ((strLine = br.readLine()) != null) { 
// string from file 

       Pattern pattern = Pattern.compile("[\\sa-zA-Z]{1,}"); 
       Matcher matcher = pattern.matcher(strLine); 
       if (matcher.matches()) { 
        System.out.print(true+ "\n"); 
       } else { 
        System.out.print(false + "\n"); 
        } 
      } 

Sortie

false // there is problem this line must true 
false 
false 
false 
true 
false 
true 
false 

Pourquoi première fois ne correspond pas.

I inserted blank line into start of file then output 

false 
true // this line was false before i insert blank line 
false 
false 
false 
true 
false 
true 
false 
+0

Juste pour info, vous pouvez remplacer tout le code dans ce * while * boucle avec 'System.out.println (strLine.matches (" [\\ sa-zA-Z] + "));' –

Répondre

0

Avez-vous essayé [\ sa-zA-Z] +

+0

Ceci est exactement équivalent à l'expression rationnelle qu'il a. Cela ne devrait rien changer. – Avi

+0

Oui.Java informera "caractère d'échappement illégal". Je pense pas de problème dans regex. –

2

Il est étrange. Vous voudrez peut-être essayer d'examiner attentivement les premières lignes couple du fichier avec hexdump:

head -2 file | hexdump -C 

Cela devrait vous dire exactement ce que les octets sont au début de la ligne.

0

première ligne deux

a 
тодорхойгүй гишүүн 

hexdump

0000-0010: ef bb bf 61-0d 0a d1 82-d0 be d0 b4-d0 be d1 80 ...a.... ........ 
0000-0020: d1 85 d0 be-d0 b9 d0 b3-d2 af d0 b9-20 d0 b3 d0 ........ ........ 
0000-0029: b8 d1 88 d2-af d2 af d0-bd      ........ . 
+1

Les trois premiers caractères ne sont pas ASCII. Êtes-vous sûr que c'est vraiment un simple fichier texte? Comment le créez-vous? –

+1

Ces trois octets sont la nomenclature UTF-8 [*]. Son utilisation est découragée par le Unicode Consortium, mais de nombreux éditeurs l'insèrent de toute façon lorsqu'ils enregistrent un fichier en UTF-8 (Windows Notepad étant l'exemple le plus notoire). [*] http://en.wikipedia.org/wiki/UTF-8#Byte-order_mark –

0

I résolu le problème en retirant les trois premiers codes non ASCII.

+0

Ce n'est pas vraiment une solution, même si c'est peut-être tout ce que vous pouvez faire. Si vous créez le fichier, voyez si vous pouvez choisir de l'enregistrer en UTF-8 * sans nomenclature * (ou signature, comme certaines applications l'appellent). –

Questions connexes