영숫자가 아닌 모든 문자를 빈 문자열로 교체


197

나는 이것을 사용하려고했지만 작동하지 않았다.

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

36
여러분, 라틴어 이외의 알파벳이 있다는 것을 잊어 버립니다.
Mateva

2
그러나 예를 들어 호스트 이름을 확인하려면 유효하지 않은 알파벳을 제외하는 것이 좋습니다.
Gurnard

답변:


245

사용하십시오 [^A-Za-z0-9].

참고 : 일반적으로 영숫자로 간주되지 않으므로 공백을 제거했습니다.


10
캐릭터 클래스의 끝에 공백도 없어야합니다.
앤드류 더피

6
그는 아마도 PHP 프로그래밍에 익숙 할 것입니다.
윌리엄

10
@William - 그것은 PHP 지금 PCRE 신용을 얻는 것이 불행한 일
토마스 Dignan

reg exp는 괜찮습니다. regexp 문자열에서 "/"를 value.replaceAll ( "/ [^ A-Za-z0-9] /", ""); value.replaceAll ( "[^ A-Za-z0-9]", ""); 정규 표현식 안에 "/"가 필요하지 않습니다. 자바 스크립트 패턴과 혼동 한 것
같습니다

128

시험

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

또는

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

4
밑줄로return value.replaceAll("\\W", "");
erickson

물론이야. 컴파일러는 그런 종류의 것을 발견하는 데 능숙합니다.
앤드류 더피

1
두 번째는 질문에 대답하지 않습니다. : / \ 등의 문자는 어떻습니까?
WW.

67

[^a-zA-Z]문자 범위 AZ / az에 속하지 않는 문자를 대체 한다는 점에 유의해야합니다 . 그 말 특수 문자 좋아 é, ß등 또는 키릴 문자 등은 제거됩니다.

이러한 문자를 교체하지 않으려면 사전 정의 된 문자 클래스를 대신 사용하십시오.

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

추신 : \p{Alnum}이 효과를 얻지 못하면와 동일하게 작동합니다 [A-Za-z0-9].


11
이 게시물에 대해 대단히 감사합니다-그것은 나에게 매우 유용했습니다. 또한 이것이 이것이 질문에 대한 실제 답변이라고 생각합니다. 라틴 알파벳이 세계에서 유일한 것은 아닙니다!
Mateva

2
실제로, 언급 된 정규 표현식은 "^"를 유효한 문자로 취급합니다. "^"의 첫 번째 항목 만 선택의 의미를 부정하기 때문입니다. [^\\p{IsAlphabetic}\\p{IsDigit}]잘 작동합니다.
Bogdan Klichuk

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에서 시도 하고 있기 때문 입니다. 그리고 안드로이드는 UNICODE_CHARACTER_CLASS기본적으로 켜져 있습니다. 정리해 주셔서 감사합니다.
Jakub Turcovsky

알파, 숫자 및 이모티콘 만 허용하는 방법?
Robert Goodrick

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

아, 누구든지 정규식으로 잘 지내고 있습니까? ;)
Michael Peterson

6

해결책:

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

설명:

[^abc] 캐럿 ^이 대괄호 안에 첫 번째 문자로 표시 되면 패턴이 무시됩니다. 이 패턴은 a 또는 b 또는 c를 제외한 모든 문자와 일치합니다.

키워드를 두 가지 기능으로 보았습니다.

  • [(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

구아바를 사용하면 다양한 유형의 기준을 쉽게 결합 할 수 있습니다. 특정 솔루션의 경우 다음을 사용할 수 있습니다.

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.