web-dev-qa-db-ja.com

正規表現「\\ p {Z}」はどういう意味ですか?

私はJavaのようなコードで作業しています

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

私は正規表現に慣れていないので、その意味は何ですか? (あなたが素晴らしい正規表現の基本を学ぶためのウェブサイトを提供できたら)私はそのような文字列についてそれを見てきました

ept as yeptasyに変換されますが、これは正しくないようです。これを書いた人は、おそらく先頭と末尾のスペースをトリミングしたかったと思います。

17
BRabbit27

すべての空白を削除します(一致するすべての空白を空の文字列に置き換えます)。

素晴らしい正規表現のチュートリアルは regular-expressions.info で入手できます。引用 このサイトから

\ p {Z}または\ p {Separator}:あらゆる種類の空白または非表示のセパレータ。

14
Alex Shesterov

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がスローされることも示しています。

5
sbecker11

まず第一に、 \pは、単一ではなく、クラス、キャラクターのコレクションに一致することを意味します。参考までに、これはパターンクラスのJavadocです。 https://docs.Oracle.com/javase/7/docs/api/Java/util/regex/Pattern.html

Unicodeスクリプト、ブロック、カテゴリ、およびバイナリプロパティは、Perlと同様に\ pおよび\ P構成で記述されます。\p {prop}は、入力にプロパティpropがある場合は一致しますが、\ P {prop}は入力にそのプロパティがある場合は一致しません。

そして、Zは文字のクラス(コレクション、セット)の名前です。この場合、それはSeparatorの省略形です。 Separatorには3つのサブクラスが含まれます:Space_SeparatorLine_SeparatorおよびParagraph_Separator。これらのクラスに含まれる文字については、ここを参照してください: http://www.unicode.org/Public/UCD/latest/ucd/PropList.txt

その他のドキュメント: http://www.unicode.org/reports/tr18/#General_Category_Property

0
Tung Linh