英数字以外のすべての文字を空の文字列に置き換える


197

私はこれを使ってみましたがうまくいきませんでした

return value.replaceAll("/[^A-Za-z0-9 ]/", "");

36
みんな、ラテン語以外のアルファベットがあることを忘れます。
Mateva 2015年

2
しかし、たとえばホスト名を検証したい場合は、無効なアルファベットを除外することをお勧めします。
ガーナード

回答:


245

を使用し[^A-Za-z0-9]ます。

注:スペースは通常英数字とは見なされないため、削除しました。


10
文字クラスの最後のスペースも同様です。
Andrew Duffy

6
彼はおそらくPHPでのプログラミングに慣れているでしょう。
ウィリアム

10
@William-PHPがPCREの功績を認められたのは残念です
Thomas Dignan

正規表現は問題ありません。value.replaceAll( "/ [^ A-Za-z0-9] /"、 "");から正規表現文字列から "/"を削除するだけです。to value.replaceAll( "[^ A-Za-z0-9]"、 ""); 正規表現内に「/」は必要ありません
。JavaScript

128

試す

return value.replaceAll("[^A-Za-z0-9]", "");

または

return value.replaceAll("[\\W]|_", "");

4
アンダースコア付きreturn value.replaceAll("\\W", "");
エリクソン2009年

もちろん。コンパイラーはそのようなことを見つけるのが得意です。
Andrew Duffy

1
2つ目は質問に答えません。/ /などの文字についてはどうですか?
WW。

67

[^a-zA-Z]は、それ自体が文字範囲AZ / azにない文字を置き換えることに注意してください。つまりéßなどの特殊文字やキリル文字などは削除されます。

これらの文字を置き換えたくない場合は、代わりに事前定義された文字クラスを使用してください。

 str.replaceAll("[^\\p{IsAlphabetic}\\p{IsDigit}]", "");

PS:\p{Alnum}この効果は得られず、と同じように機能し[A-Za-z0-9]ます。


11
この投稿を本当にありがとう-それは私にとって非常に役に立ちました。さらに、これが質問に対する実際の答えだと思います。ラテン系のアルファベットだけではありません!
Mateva、2015年

2
実際には、「^」の最初の出現のみが選択の意味を否定しているため、指定された正規表現は「^」を有効な文字として扱います。[^\\p{IsAlphabetic}\\p{IsDigit}]うまくいきます。
ボグダンクリチュク

1
@JakubTurcovsky docs.oracle.com/javase/10/docs/api/java/util/regex/Pattern.htmlは、IsAlphabeticおよびIsDigitをバイナリプロパティとして定義します。AlphaとDigitはPOSIX文字クラスです(US-ASCIIのみ)。docs.oracle.com/javase/10/docs/api/java/util/regex/…フラグが指定されている場合を除きます。
Andre Steingress

@AndreSteingress正解です。理由{IsDigit}は私にとっては機能せず{Digit}、Androidでこれを試しているためです。AndroidはUNICODE_CHARACTER_CLASSデフォルトでオンになっています。クリアランスをありがとう。
Jakub Turcovsky

Alpha、Digit、Emojiのみを許可するにはどうすればよいですか?
ロバートグッドリック

50
return value.replaceAll("[^A-Za-z0-9 ]", "");

これによりスペースはそのまま残ります。それがあなたの望んでいることだと思います。それ以外の場合は、正規表現からスペースを削除します。


21

次のより簡単な正規表現を試すこともできます。

 str = str.replaceAll("\\P{Alnum}", "");

2
または、空白を保持します:str.replaceAll("[^\\p{Alnum}\\s]", "")
Jonik

または\\p{Alnum}\\p{Space}
membersound

10

Javaの正規表現では/、Perlなどの他の言語とは異なり、正規表現の前後にスラッシュ()またはその他の区切り文字を付ける必要はありません。


8

私はファイル名を作成するためにこの方法を作りました:

public static String safeChar(String input)
{
    char[] allowed = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_".toCharArray();
    char[] charArray = input.toString().toCharArray();
    StringBuilder result = new StringBuilder();
    for (char c : charArray)
    {
        for (char a : allowed)
        {
            if(c==a) result.append(a);
        }
    }
    return result.toString();
}

5
これはかなり力ずくです。正規表現は、OPの状況に対応する方法です。
Michael Peterson

1
あなたは正しい、正規表現が優れています。しかし、当時、正規表現と私はうまくいかなかった。
zneo

ああ、誰かが本当に正規表現でうまくやっていますか?;)
マイケルピーターソン、

6

解決:

value.replaceAll("[^A-Za-z0-9]", "")

説明:

[^abc] キャレット^が角括弧内の最初の文字として現れると、パターンを否定します。このパターンは、a、b、c以外のすべての文字に一致します。

キーワードを2つの関数として見る:

  • [(Pattern)] = match(Pattern)
  • [^(Pattern)] = notMatch(Pattern)

さらに、パターンに関して:

  • A-Z = all characters included from A to Z

  • a-z = all characters included from a to z

  • 0=9 = all characters included from 0 to 9

したがって、パターンに含まれていないすべての文字を置き換えます


3

たとえばドイツ語のウムラウトのように、ASCII文字セットに属さない英数字も許可する場合は、次の解決策の使用を検討できます。

 String value = "your value";

 // this could be placed as a static final constant, so the compiling is only done once
 Pattern pattern = Pattern.compile("[^\\w]", Pattern.UNICODE_CHARACTER_CLASS);

 value = pattern.matcher(value).replaceAll("");

UNICODE_CHARACTER_CLASSフラグを使用すると、パフォーマンスが低下する可能性があることに注意してください(このフラグのjavadocを参照してください)。


1

簡単な方法:

public boolean isBlank(String value) {
    return (value == null || value.equals("") || value.equals("null") || value.trim().equals(""));
}

public String normalizeOnlyLettersNumbers(String str) {
    if (!isBlank(str)) {
        return str.replaceAll("[^\\p{L}\\p{Nd}]+", "");
    } else {
        return "";
    }
}


1

Guavaを使用すると、さまざまなタイプの基準を簡単に組み合わせることができます。特定のソリューションについては、以下を使用できます。

value = CharMatcher.inRange('0', '9')
        .or(CharMatcher.inRange('a', 'z')
        .or(CharMatcher.inRange('A', 'Z'))).retainFrom(value)

1

GuavaのCharMatcherは簡潔なソリューションを提供します:

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