2015-05-12 8 views
9

ich mit einigen Code in Java arbeite, die eine Aussage wieWas bedeutet Regex "\ p {Z}"?

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

Ich bin es gewohnt, nicht zu regex hat, so was ist der Sinn des Lebens? (Wenn Sie eine Website zur Verfügung stellen könnten die Grundlagen der Regex zu lernen, die wunderbar sein würde) Ich habe das wie

für einen String gesehen

ept as y es in eptasy umgewandelt wird, aber dies scheint nicht richtig. Ich glaube, der Typ, der das geschrieben hat, wollte vielleicht führende und nachgestellte Leerzeichen schneiden.

+0

Nein, es ist richtig, dass Sie [hier] (https://regex101.com/r/cG1tG6/1) sehen können, dass es alle whitespaces abgleicht, also entfernt es sie im angegebenen Code mit 'replaceAll()'. –

Antwort

6

Es entfernt alle Leerzeichen (ersetzt alle Leerzeichen mit leeren Zeichenfolgen).

Ein wunderbares Regex-Tutorial ist unter regular-expressions.info verfügbar. A citation from this site:

\ p {Z} oder \ {p} Separator: jede Art von Leerzeichen oder unsichtbar Separator.

+0

Und was ist mit dem ersten Schrägstrich? – BRabbit27

+0

Der erste Schrägstrich ist ein Escape-Zeichen, um anzuzeigen, dass 'p {Z}' auf einen regulären Ausdruck verweist, der nach Whitespace statt nur nach 'p',' ',' Z' und '}' sucht. – jojo

+8

Der Backslash wird im Programmcode verdoppelt, weil es die Syntax von Java für String-Literale ist. Der Java-Compiler macht einen Backslash daraus, und die Zeichenfolge mit einem Schrägstrich wird an die Regex-Engine übergeben. Siehe [Regex-Tutorial, Abschnitt "Sonderzeichen und Programmiersprachen"] (http://www.regular-expressions.info/characters.html) –

3

Das OP gab an, dass das Codefragment in Java war. Um die Aussage zu kommentieren:

\ p {Z} oder \ p {Separator}: irgendeine Art von Leerzeichen oder unsichtbarer Separator.

Der folgende Beispielcode zeigt, dass dies in Java nicht gilt.

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 

Der Ausgang hierfür ist:

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} 
      ^

Dies zeigt, dass in Java \\ p {Z} nur Leerzeichen und nicht "jede Art von Leerzeichen oder unsichtbar Separator" entfernt.

Diese Ergebnisse zeigen auch, dass in Java \\ p {Separator} eine PatternSyntaxException auslöst.

+0

\\ s stimmt nicht mit '\ u00A0' überein (Leerzeichen ohne Leerzeichen) – Yahor