Что означает регулярное выражение "\\ p {Z}"?

Я работаю с некоторым кодом в java, который имеет оператор вроде

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

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

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

Ответ 1

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

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

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

Ответ 2

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\\p {Z} удаляются только пробелы, а не "любой вид пробела или невидимый разделитель".

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

Ответ 3

Прежде всего, \p означает, что вы собираетесь сопоставить класс, набор символов, а не один. Для справки, это Javadoc класса Pattern. https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

Сценарии, блоки, категории и двоичные свойства Unicode пишутся с помощью конструкций \p и\P, как в Perl. \p {prop} совпадает, если у входа есть свойство prop, а \P {prop} не совпадает, если у входа есть это свойство.

И тогда Z - это имя класса (коллекция, набор) символов. В данном случае это аббревиатура Separator. Separator содержит 3 подкласса: Space_Separator, Line_Separator и Paragraph_Separator. Укажите здесь, какие символы эти классы содержат здесь: http://www.unicode.org/Public/UCD/latest/ucd/PropList.txt

Дополнительный документ: http://www.unicode.org/reports/tr18/#General_Category_Property