2015-05-12 4 views
9

Я работаю с некоторым кодом в Java, который имеет заявление какЧто означает regex "\ p {Z}"?

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

Я не привык к регулярному выражению, так что смысл этого? (Если бы вы могли предоставить веб-сайт, чтобы изучить основы регулярного выражения, это было бы замечательно). Я видел, что для строки, такой как

ept as y он преобразуется в eptasy, но это не кажется правильным. Я считаю, что парень, который написал это, хотел урезать ведущие и задние пространства.

+0

Нет, вы можете видеть [здесь] (https://regex101.com/r/cG1tG6/1), что он соответствует всем пробелам, поэтому он удаляет их в заданном коде с помощью функции replaceAll(). –

ответ

6

Удаляет все пробелы (заменяет все пробельные символы пустыми строками).

Замечательное учебное пособие по регулярному выражению доступно по адресу regular-expressions.info. цитата from this site:

\ р {Z} или \ {р} Сепаратор: любой вид пробельных или невидимого сепаратора.

+0

А как насчет первой косой черты? – BRabbit27

+0

Первая косая черта - это escape-символ, обозначающий, что 'p {Z}' относится к регулярному выражению, ищущему пробелы, а не просто 'p',' {',' Z' и '}'. – jojo

+8

Обратная косая черта удваивается в программном коде, потому что это синтаксис Java для строковых литералов. Компилятор Java делает один обратный слэш из него, а строка с одной косой чертой передается движку Regex. См. [Учебник по языку Regex, раздел «Специальные символы и языки программирования»] (http://www.regular-expressions.info/characters.html) –

3

OP заявила, что фрагмент кода был на Java. Прокомментировать заявление:

\ p {Z} или \ p {Separator}: любой вид пробела или невидимый разделитель.

пример кода ниже показывает, что это не применяется в 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 

Выходной сигнал для этого является:

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

Это показывает, что в Java \\ р {Z} удаляет только пробелы, а не «любого вида пробелов или невидимого сепаратора».

Эти результаты также показывают, что в Java \\ p {Separator} выбрасывается исключение PatternSyntaxException.

+0

\\ s не соответствует '\ u00A0' (без пробела) – Yahor

Смежные вопросы