10

文字列をアルファベット以外の文字に沿って文字列配列に分割したいと考えています。例えば:

"Here is an ex@mple" => "Here", "is", "an" "ex", "mple"

正規表現でString.split(String regex)メソッドを使用してみました"(?![\\p{Alpha}])"。ただし、これは文字列を次のように分割します

"Here", "_is", "_an", "_ex", "@ample"

(これらのアンダースコアは、スペースがあることを強調するためのものです)。?!これは、正規表現演算子が「ゼロ幅」であり、実際には、入力文字列の非アルファベット文字の前にあるゼロ幅文字を分割して削除しているためだと思います。

文字列を分割する際に実際の英字以外の文字を削除するにはどうすればよいですか? 非ゼロ幅の否定演算子はありますか?

4

5 に答える 5

20

あなたが試すことができます\P{Alpha}+

"Here is an ex@mple".split("\\P{Alpha}+")
["Here", "is", "an", "ex", "mple"]

\P{Alpha}は、アルファベット以外の任意の文字に一致します (任意のアルファベット文字に一致する とは対照的に\p{Alpha})。+そのような文字の連続した文字列で分割する必要があることを示します。例えば:

"a!@#$%^&*b".split("\\P{Alpha}+")
[「a」、「b」]
于 2012-12-05T01:05:09.337 に答える
5

ここにはすでにいくつかの回答がありますが、どれも国際化の問題をうまく処理していません。そして、OPの例から「英語」の文字だと推測されても、検索からここに来た訪問者はそうではないかもしれません...

... したがって、Java はUnicode Technical Standard #18 "Unicode Regular Expressions"をサポートしていることに言及する価値があります。かなり印象的ですね。明らかに、これは国際文字を扱うために指定された古典的な (ラテン語中心またはイベント英語中心の) 正規表現の拡張です。

たとえば、Java はバイナリ プロパティの完全なセットをサポートして、文字が Unicode コード ポイント文字クラスのいずれかに属しているかどうかをチェックします。特に\p{IsAlphabetic}文字クラスは、Unicode がサポートする言語の文字に対応する任意のアルファベット文字に一致します。

明確ではありません ?次に例を示します。

    Pattern p = Pattern.compile("\\p{IsAlphabetic}+");
    //                           ^^^^^^^^^^^^^^^^^
    //                         any alphabetic character
    //                    (in any Unicode-supported language)

    Matcher m = p.matcher("L'élève あゆみ travaille _bien_");
    while(m.find()) {
        System.out.println(">" + m.group());
    }

または、 split を使用して英字以外の文字を分割することとほとんど同じです。

    for (String s : "L'élève あゆみ travaille bien".split("\\P{IsAlphabetic}+"))
        System.out.println(">" + s);

どちらの場合も、出力は、フランス語のアクセント付き文字と日本語のひらがなを考慮して、単語を適切にトークン化します。これは、Unicode がサポートされている言語 (補助的な多言語プレーンを含む)を使用して綴られた単語の場合と同様です。

于 2015-10-29T13:14:40.080 に答える
0

しません

"Here is an ex@mple".split("\\S\\w+")

仕事?

于 2012-12-05T01:24:22.830 に答える
0

他の回答に加えて、文字列内の文字を反復処理し、ASCII 値が小文字と大文字の範囲内にあるかどうかをテストし、そうでない場合は目的の「分割」動作を実行できます。

char[] chars = str.toCharArray(); 役に立つかもしれません。

于 2014-09-29T15:19:29.657 に答える