文字列から特殊文字を削除するにはどうすればよいですか?


90

次のような特殊文字を削除したい:

- + ^ . : ,

Javaを使用して文字列から。


質問にタグを付けた方法に基づいて、正規表現が何であるかをすでに知っているようです。Stringクラスのドキュメントを読んでみましたか?特に、「正規表現」という単語を探します。いくつかの方法があり、少し考えて進め方を教えてください... :)
Karl Knechtel 2011

3
「特殊文字」というフレーズは使いすぎて、ほとんど完全に無意味です。「削除したい特定の文字のリストがあります」という意味の場合は、Thomasが提案するように実行し、正規表現の文字クラスを使用replaceAllしてパターンを形成します。より難解な要件がある場合は、質問を編集してください。:)
レイトール2011

1
これらは特殊文字ではありません...これらは次のとおりです:äâêíìéè-+ ^のような一般的な1バイトの文字タイプではないため...とにかく、レイが述べたように、replaceAllそれらのために行うか、または解析を行います文字列で、取り出したい文字ではない文字を別の文字列に追加し、最後に、返す文字列に+ =を実行します。
ゴンサロビエイラ2011

deleteChars.apply( fromString, "-+^.:," );ここでdeleteCharsを見つけます
カプラン

回答:


255

それはあなたが特殊文字として定義するものに依存しますが、試してみてくださいreplaceAll(...)

String result = yourString.replaceAll("[-+.^:,]","");

注ことを^あなたはどちらかそれをエスケープする必要があるだろうか、それは「任意のこれらの文字」を意味するからである文字は、リストの最初の1であってはなりません。

別の注意:-文字はリストの最初または最後の文字である必要があります。そうでない場合は、エスケープする必要があります。そうしないと、範囲が定義されます(たとえば:-,、「:からの範囲内のすべての文字」を意味します,)。

だから、文字の位置に依存一貫性を維持していないために、あなたは正規表現で特別な意味を持っているすべてのそれらの文字をエスケープする場合があります(以下のリストは、それほどのような他の文字を認識して、完全ではない({$ など) :

String result = yourString.replaceAll("[\\-\\+\\.\\^:,]","");


すべての句読点と記号を削除したい場合は、この正規表現を試してください:( \p{P}\p{S}Java文字列では、バックスラッシュをエスケープする必要があることに注意してください:) "\\p{P}\\p{S}"

文字列に何を残すかを正確に定義できる場合、3番目の方法は次のようになります。

String  result = yourString.replaceAll("[^\\w\\s]","");

つまり、単語文字(いずれの場合も、0〜9または_)または空白以外のすべてを置き換えます。

編集:役立つと思われるパターンが他にもいくつかあることに注意してください。ただし、すべてを説明することはできないので、regular-expressions.infoのリファレンスセクションをご覧ください

Rayが提案しているように、「許可された文字を定義する」アプローチに代わる制限の少ない方法を次に示します。

String  result = yourString.replaceAll("[^\\p{L}\\p{Z}]","");

正規表現は、どの言語の文字でも区切り文字でもないすべてのもの(空白、改行など)に一致します。使用できないことに注意してください[\P{L}\P{Z}](大文字のPはそのプロパティがないことを意味します)。これは、文字が空白ではないため、ほぼすべてに一致する「文字でも空白でもないすべて」を意味するためです。

Unicodeに関する追加情報

一部のUnicode文字は、(単一のコードポイントまたはコードポイントの組み合わせとして)エンコードする方法が異なるため、問題を引き起こすようです。詳細については、regular-expressions.infoを参照してください。


最高の汎用ソリューションの場合は+1。OPに詳細がない場合にいくつかのバリエーションをリストしているので、次のようなパターンを表示して説明することもできます[\P{L}]
Ray Toal 2011

また、-文字はリストの最初または最後である必要があり、そうでない場合はエスケープする必要があることに注意してください。
kapex 2011

[^\\p{L}\\p{Z}]ドイツ語のウムラウト(ä、ö、ü)も削除しているようです(少なくとも私にとってはそうです:/)。したがって、「正規表現はどの言語の文字でもないものすべてに一致します」は100%正しくないようです。
ピーター

@Peterそれは私のテストでそれらの文字を排除しません。あなたの場合、別の問題があるかもしれません、例えば、テキストの異なるエンコーディング。詳細情報へのリンクを追加します。
トーマス

1
@ThomasString result = yourString.replaceAll("[^\w\s]","");がエラーをInvalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )
起こす


18

ここで説明されているように http://developer.android.com/reference/java/util/regex/Pattern.html

パターンはコンパイルされた正規表現です。多くの場合、のような便利なメソッドString.matchesString.replaceAllおよびString.split好ましいであろうが、あなたは同じ正規表現で多くの作業を行う必要がある場合、一度それをコンパイルし、それを再利用する方が効率的かもしれません。PatternクラスとそのコンパニオンであるMatcherも、Stringによって公開される少量よりも多くの機能を提供します。

public class RegularExpressionTest {

public static void main(String[] args) {
    System.out.println("String is = "+getOnlyStrings("!&(*^*(^(+one(&(^()(*)(*&^%$#@!#$%^&*()("));
    System.out.println("Number is = "+getOnlyDigits("&(*^*(^(+91-&*9hi-639-0097(&(^("));
}

 public static String getOnlyDigits(String s) {
    Pattern pattern = Pattern.compile("[^0-9]");
    Matcher matcher = pattern.matcher(s);
    String number = matcher.replaceAll("");
    return number;
 }
 public static String getOnlyStrings(String s) {
    Pattern pattern = Pattern.compile("[^a-z A-Z]");
    Matcher matcher = pattern.matcher(s);
    String number = matcher.replaceAll("");
    return number;
 }
}

結果

String is = one
Number is = 9196390097

これにより、アラビア文字が削除されます
S0haibNasir19年

15

クラスのreplaceAll()メソッドを試してくださいString

ところで、ここにメソッド、戻り値の型、パラメーターがあります。

public String replaceAll(String regex,
                         String replacement)

例:

String str = "Hello +-^ my + - friends ^ ^^-- ^^^ +!";
str = str.replaceAll("[-+^]*", "");

削除したいすべての{'^'、 '+'、 '-'}文字を削除する必要があります。


6

特殊文字を削除するには

String t2 = "!@#$%^&*()-';,./?><+abdd";

t2 = t2.replaceAll("\\W+","");

出力は次のようになります: abdd.

これは完全に機能します。


1
文字列リテラルで不正なエスケープ文字を取得します
John Joe

スペースを保持したい場合は、これによってスペースも削除されます。t2= t2.replaceAll( "[^ \\ w \\ s]"、 "");を使用します。
Isuru Dilshan

2

String.replaceAll()Javaでメソッドを使用します。 replaceAllは、問題を解決するのに十分なはずです。


1

次のように単一の文字を削除できます。

String str="+919595354336";

 String result = str.replaceAll("\\\\+","");

 System.out.println(result);

出力:

919595354336

0

Javaでリテラル置換を実行したいだけの場合は、を使用Pattern.quote(string)して任意の文字列をリテラルにエスケープします。

myString.replaceAll(Pattern.quote(matchingStr), replacementStr)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.