Alfasayısal olmayan tüm karakterleri boş dizelerle değiştirme


197

Bunu kullanmayı denedim ama işe yaramadı-

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

36
Çocuklar, Latin alfabesinden başka alfabeler olduğunu unutuyorsunuz.
Mateva

2
Ancak, örneğin bir ana bilgisayar adını doğrulamak istiyorsanız, geçersiz alfabe harflerini hariç tutmak iyi olur.
Gurnard

Yanıtlar:


245

Kullanın [^A-Za-z0-9].

Not: alan tipik olarak alfasayısal kabul edilmediğinden kaldırıldı.


10
Karakter sınıfının sonundaki boşluk da olmamalıdır.
Andrew Duffy

6
Muhtemelen PHP'de programlama yapmaya alışkındır.
William

10
@William - PHP'nin PCRE için kredi alması talihsiz
Thomas Dignan

reg exp tamam, "/" ifadesini regexp dizesinden value.replaceAll ("/ [^ A-Za-z0-9] /", ""); to value.replaceAll ("[^ A-Za-z0-9]", ""); regexp içinde "/" gerekmez, bence javascript desenleri ile karışık
eriknyk

128

Deneyin

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

veya

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

4
return value.replaceAll("\\W", "");
Alt çizgileri

Elbette. Derleyiciler bu tür şeyleri tespit etmede harikalar.
Andrew Duffy

1
İkincisi soruyu cevaplamıyor. / \ Etc gibi karakterlere ne dersiniz?
WW.

67

[^a-zA-Z]AZ / az karakter aralığında kendiliğinden olmayan karakterlerin yerini alacağının farkında olmalısınız . Bu é, ßvb. Gibi özel karakterlerin veya kiril karakterlerinin kaldırılacağı anlamına gelir .

Bu karakterlerin değiştirilmesi istenmiyorsa, bunun yerine önceden tanımlanmış karakter sınıflarını kullanın:

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

PS: \p{Alnum}bu etkiyi elde etmez, aynı şekilde davranır [A-Za-z0-9].


11
Bu yazı için çok teşekkürler - benim için çok yararlı oldu. Ayrıca, sorunun asıl cevabı olduğuna inanıyorum. Latin alfabesi dünyada tek olan değil!
Mateva

2
Aslında, belirtilen normal ifade "^" öğesini geçerli bir karakter olarak ele alacaktır, çünkü yalnızca "^" ifadesinin ilk oluşumu seçimin anlamını reddetmektedir. [^\\p{IsAlphabetic}\\p{IsDigit}]iyi çalışıyor.
Bogdan Klichuk

1
@JakubTurcovsky docs.oracle.com/javase/10/docs/api/java/util/regex/Pattern.html IsAlphabetic ve IsDigit'i ikili özellikler olarak tanımlar. Alfa ve Rakam POSIX karakter sınıflarıdır (yalnızca ABD-ASCII). Docs.oracle.com/javase/10/docs/api/java/util/regex/… bayrağı dışında belirtilmiştir.
Andre Steingress

@AndreSteingress Doğru, nedeni {IsDigit}benim için {Digit}çalışmıyor ve bunu Android'de deniyorum. Ve Android UNICODE_CHARACTER_CLASSvarsayılan olarak açıktır. Açıklık için teşekkürler.
Jakub Turcovsky

Yalnızca Alfa, Rakam ve Emoji'ye nasıl izin verilir?
Robert Goodrick

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

Bu, boşlukları olduğu gibi bırakacaktır . Sanırım istediğin bu. Aksi takdirde, regex'ten alanı kaldırın.


21

Bu daha basit normal ifadeyi de deneyebilirsiniz:

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

2
Veya boşlukları koruyarak:str.replaceAll("[^\\p{Alnum}\\s]", "")
Jonik

Veya \\p{Alnum}\\p{Space}.
Üye

10

Java'nın düzenli ifadeleri /, örneğin Perl gibi diğer dillerin aksine, normal ifade etrafına eğik çizgi ( ) veya başka bir sınırlayıcı koymanızı gerektirmez .


8

Dosya adları oluşturmak için bu yöntemi yaptım:

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
Bu oldukça kaba bir kuvvet. Regex, OP'nin durumu ile devam etmenin yoludur.
Michael Peterson

1
Haklısın, normal ifade daha iyi. Ama o zaman, regex ve ben iyi gelmedim.
zneo

Hah, regex ile gerçekten iyi geçinen var mı? ;)
Michael Peterson

6

Çözüm:

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

Açıklama:

[^abc] Bir düzeltme işareti ^köşeli parantez içindeki ilk karakter olarak göründüğünde, deseni reddeder. Bu desen, a veya b veya c dışında herhangi bir karakterle eşleşir.

Anahtar kelimeye iki işlev olarak bakmak:

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

Üstelik bir kalıpla ilgili olarak:

  • 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

Bu nedenle, desende yer almayan tüm karakterlerin yerine geçecektir


3

Ascii karakter kümesine ait olmayan alfasayısal karakterlere de izin vermek istiyorsanız, örneğin alman umlaut'ları gibi, aşağıdaki çözümü kullanmayı düşünebilirsiniz:

 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 bayrağını kullanmanın performans cezasına neden olabileceğini lütfen unutmayın (bu bayrağın javadocuna bakın)


1

Basit yöntem:

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'yı kullanarak farklı kriter türlerini kolayca birleştirebilirsiniz. Özel çözümünüz için şunları kullanabilirsiniz:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.