2015-05-12 14 views
9

Sto lavorando con un certo codice in Java che ha una dichiarazione del genereCosa significa regex "\ p {Z}" significa?

String tempAttribute = ((String) attributes.get(i)).replaceAll("\\p{Z}","") 

io non sono abituato a regex, quindi qual è il significato di esso? (Se potessi fornire un sito web per imparare le basi della regex che sarebbe meraviglioso) l'ho visto per una stringa come

ept as y viene trasformato in eptasy, ma questo non sembra giusto. Credo che il tizio che ha scritto questo volesse ritagliare gli spazi principali e finali forse.

+0

Non è corretto puoi vedere [qui] (https://regex101.com/r/cG1tG6/1) che corrisponde a tutti gli spazi bianchi, quindi li rimuove nel codice dato con 'replaceAll()'. –

risposta

6

Rimuove tutti gli spazi bianchi (sostituisce tutte le corrispondenze di spazi vuoti con stringhe vuote).

Un meraviglioso tutorial sull'espressione regolare è disponibile allo regular-expressions.info. Una citazione from this site:

\ p {Z} o \ p {} Separatore: qualsiasi tipo di spazio bianco o un separatore invisibile.

+0

E per quanto riguarda la prima barra? – BRabbit27

+0

La prima barra è un carattere di escape per indicare che "p {Z}" si riferisce ad un'espressione regolare che cerca spazi bianchi invece di solo 'p',' {',' Z' e '}'. – jojo

+8

Il backslash è raddoppiato nel codice del programma perché è la sintassi di Java per i letterali stringa. Il compilatore Java ne fa un backslash e la stringa con una barra viene passata al motore Regex. Vedi [Esercitazione Regex, sezione "Caratteri speciali e linguaggi di programmazione"] (http://www.regular-expressions.info/characters.html) –

3

L'OP ha dichiarato che il frammento di codice era in Java. Per commentare la dichiarazione:

\ p {Z} o \ p {Separatore}: qualsiasi tipo di spazio bianco o separatore invisibile.

il seguente codice di esempio mostra che questo non si applica in Java.

public static void main(String[] args) { 

    // some normal white space characters 
    String str = "word1 \t \n \f \r " + '\u000B' + " word2"; 

    // various regex patterns meant to remove ALL white spaces 
    String s = str.replaceAll("\\s", ""); 
    String p = str.replaceAll("\\p{Space}", ""); 
    String b = str.replaceAll("\\p{Blank}", ""); 
    String z = str.replaceAll("\\p{Z}", ""); 

    // \\s removed all white spaces 
    System.out.println("s [" + s + "]\n"); 

    // \\p{Space} removed all white spaces 
    System.out.println("p [" + p + "]\n"); 

    // \\p{Blank} removed only \t and spaces not \n\f\r 
    System.out.println("b [" + b + "]\n"); 

    // \\p{Z} removed only spaces not \t\n\f\r 
    System.out.println("z [" + z + "]\n"); 

    // NOTE: \p{Separator} throws a PatternSyntaxException 
    try { 
     String t = str.replaceAll("\\p{Separator}",""); 
     System.out.println("t [" + t + "]\n"); // N/A 
    } catch (Exception e) { 
     System.out.println("throws " + e.getClass().getName() + 
       " with message\n" + e.getMessage()); 
    } 

} // public static void main 

L'uscita per questo è:

s [word1word2] 

p [word1word2] 

b [word1 


word2] 

z [word1  


word2] 

throws java.util.regex.PatternSyntaxException with message 
Unknown character property name {Separator} near index 12 
\p{Separator} 
      ^

Questo dimostra che in Java \\ p {Z} rimuove solo gli spazi e non "qualsiasi tipo di spazio o di separazione invisibile".

Questi risultati mostrano anche che in Java \\ p {Separator} genera una PatternSyntaxException.

+0

\\ s non corrisponde a '\ u00A0' (spazio vuoto no-break) – Yahor