문자열에서 특수 문자를 제거하는 방법은 무엇입니까?


90

다음과 같은 특수 문자를 제거하고 싶습니다.

- + ^ . : ,

Java를 사용하는 문자열에서.


질문에 태그를 지정하는 방법에 따라 정규식이 무엇인지 이미 알고 있습니다. String수업 문서를 읽어 보셨나요 ? 특히 '정규식'이라는 단어를 찾으십시오. 거기에 몇 가지 방법이 있고, 생각의 비트는 진행 방법을 알려해야 ... :)
칼 Knechtel

3
"특수 문자"라는 구절은 너무 과도하게 사용되어 거의 완전히 의미가 없습니다. 의미하는 바가 "내가 제거하고 싶은 특정 문자 목록이 있습니다 ."라면 Thomas가 제안한대로 수행하고 정규식 문자 클래스를 사용하여 패턴을 형성 replaceAll하면됩니다. 더 난해한 요구 사항이 있으면 질문을 편집하십시오. :)
레이 톨

1
그것들은 특수 문자가 아닙니다 ... 이것들은 다음과 같습니다 : äâêíìéè 그들은 일반적인 1 바이트 문자 유형이 아니기 때문에-+ ^는 ... 어쨌든 Ray가 말했듯 replaceAll이 그들을 위해 a 를 수행하거나 구문 분석을 수행합니다. 문자열에서 꺼내고 싶은 문자가 아닌 문자를 다른 문자열에 추가하고 결국 반환 할 문자열에 + =를 수행합니다.
Gonçalo Vieira

deleteChars.apply( fromString, "-+^.:," );여기에서 deleteChars 찾기
Kaplan

답변:


255

특수 문자로 정의하는 내용에 따라 다르지만 다음을 시도하십시오 replaceAll(...).

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

^문자는 목록에서 첫 번째 문자가 아니어야합니다 . 문자를 이스케이프해야하거나 "이 문자를 제외한 모든 문자"를 의미하기 때문입니다.

또 다른 참고 사항 : -문자는 목록의 첫 번째 또는 마지막 문자 여야합니다. 그렇지 않으면 이스케이프 처리하거나 범위를 정의해야합니다 (예 : :-," :~ 범위의 모든 문자를 의미 함 ,).

문자 위치에 따라 일관성을 유지하기 위해하지 그래서, 당신은 정규 표현식에서 특별한 의미를 갖는 모든 문자를 탈출 할 수 있습니다 (을 다음 목록, 그래서 다른 문자를 인식 완료되지 수있는 것처럼 (, {, $ 등) :

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


모든 구두점과 기호를 제거하려면 다음 정규식을 시도하십시오. \p{P}\p{S}(Java 문자열에서는 백 슬래시를 이스케이프해야합니다 :) "\\p{P}\\p{S}".

세 번째 방법은 다음과 같은 방법이 될 수 있습니다. 문자열에 무엇이 남아 있어야하는지 정확히 정의 할 수 있습니다.

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는 해당 속성이 없음을 의미합니다). 문자가 공백이 아니고 그 반대의 경우도 마찬가지이므로 모든 것과 거의 일치하는 "문자가 아니거나 공백이 아닌 모든 것"을 의미하기 때문에 사용할 수 없습니다.

유니 코드에 대한 추가 정보

일부 유니 코드 문자는 인코딩하는 다양한 방법 (단일 코드 포인트 또는 코드 포인트 조합)으로 인해 문제를 일으키는 것으로 보입니다. 자세한 내용은 regular-expressions.info 를 참조하십시오.


최고의 범용 솔루션은 +1입니다. 당신이 OP에서 세부 사항이없는 경우에 몇 가지 변화를 나열하고 있기 때문에, 당신은뿐만 아니라 보여 같은 패턴을 설명 할 수[\P{L}]
레이 톨

또한 -문자는 목록의 첫 번째 또는 마지막 문자 여야하며 그렇지 않으면 이스케이프되어야합니다.
kapex 2011 년

[^\\p{L}\\p{Z}]독일어 움라우트 (ä, ö, ü)도 제거하는 것 같습니다 (적어도 저에게는 그렇게합니다 : /). 그래서 "정규식은 어떤 언어로 된 문자가 아닌 모든 것과 일치합니다"가 100 % 정확하지 않은 것 같습니다.
Peter

@Peter 내 테스트에서 해당 문자를 제거하지 않습니다. 귀하의 경우에는 텍스트의 다른 인코딩과 같은 다른 문제가있을 수 있습니다. 더 많은 정보에 대한 링크를 추가하겠습니다.
Thomas

1
@Thomas는 String result = yourString.replaceAll("[^\w\s]","");오류를 만드는Invalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )
Visruth


18

여기에 설명 된대로 http://developer.android.com/reference/java/util/regex/Pattern.html

패턴은 컴파일 된 정규식입니다. 대부분의 경우, 편의점과 같은 방법 String.matches, String.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

이 아랍어 문자를 제거합니다
S0haib 나시에게

15

수업 replaceAll()방법을 시도하십시오 String.

여기서 BTW는 메서드, 반환 유형 및 매개 변수입니다.

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
문자열 리터럴에서 불법 이스케이프 문자를 얻을 것이다
존 조에게

공백을 유지하려면 공백도 제거하고 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.