문자열에서 비 ASCII 문자를 어떻게 제거 할 수 있습니까? (C #에서)


227

문자열에서 비 ASCII 문자를 어떻게 제거 할 수 있습니까? (C #에서)


4
아래 의 sinelaw의 대답에 따라 비 ASCII 문자 를 바꾸 려면 대신 이 대답을 참조하십시오 .
Bobson

답변:


414
string s = "søme string";
s = Regex.Replace(s, @"[^\u0000-\u007F]+", string.Empty);

19
우리에게 RegEx가 도전했다면 RegEx 패턴을 일반 영어로 작성해 주시겠습니까? 다시 말해, "^는 이것을한다"등.
Metro Smurf

47
@Metro Smurf ^는 연산자가 아닙니다. 정규식에 일치하는 모든 항목 대신 일치하지 않는 모든 항목을 찾도록 지시합니다. \ u ####-\ u ####은 어떤 문자가 일치 하는지를 나타냅니다. \ u0000- \ u007F는 utf-8 또는 유니 코드에서 처음 255 자에 해당하며 항상 ASCII 문자입니다. 따라서 아스키 문자가 아닌 모든 문자를 일치시키고 일치하지 않는 모든 문자를 바꿉니다.
Gordon Tucker

41
인쇄 할 수없는 문자의 범위는 0020-007E입니다. 인쇄 할 수없는 문자를 대체하기 위해 정규식을 찾는 사람들에게는
Mubashar

1
@GordonTucker \ u0000- \ u007F은의 equivilent입니다 첫번째 127 자 UTF-8 유니 코드 및 NOT 최초의 225 참조에서 테이블
full_prog_full

4
@full_prog_full 그렇기 때문에 1 분 후에 255가 아니라 127이라고 수정하도록 스스로에게 답한 이유가 있습니다. :)
Gordon Tucker

125

정규식을 사용하지 않는 순수한 .NET 솔루션은 다음과 같습니다.

string inputString = "Räksmörgås";
string asAscii = Encoding.ASCII.GetString(
    Encoding.Convert(
        Encoding.UTF8,
        Encoding.GetEncoding(
            Encoding.ASCII.EncodingName,
            new EncoderReplacementFallback(string.Empty),
            new DecoderExceptionFallback()
            ),
        Encoding.UTF8.GetBytes(inputString)
    )
);

번거로울 수 있지만 직관적이어야합니다. .NET ASCII 인코딩을 사용하여 문자열을 변환합니다. UTF8은 원래 문자를 나타낼 수 있으므로 변환 중에 사용됩니다. EncoderReplacementFallback을 사용하여 비 ASCII 문자를 빈 문자열로 변환합니다.


5
완전한! RTF 문서에 저장하기 전에 문자열을 정리하기 위해 이것을 사용하고 있습니다. 대단히 감사합니다. 정규식 버전보다 이해하기 쉽습니다.
Nathan Prather

21
정말 이해하기 쉬워요? 나에게 실제로 관련이없는 모든 것 (대체, 바이트 변환 등)은 실제로 일어나는 일에서주의를 끌고 있습니다.
bzlm

21
스크류 드라이버가 너무 혼란 스럽기 때문에 망치를 대신 사용하겠습니다.
Brandon

8
@Brandon, 실제로이 기술은 다른 기술보다 더 잘 작동하지 않습니다. 따라서 유추는 화려한 iScrewDriver Deluxe 2000 대신에 오래된 구형 드라이버를 사용했을 것입니다. :)
bzlm

10
한 가지 장점은 ASCII를 ISO 8859-1 또는 다른 인코딩으로 쉽게 대체 할 수 있다는 것입니다. :
Yamamoto Akira

38

MonsCamus의 의미는 다음과 같습니다.

parsememo = Regex.Replace(parsememo, @"[^\u0020-\u007E]", string.Empty);

1
IMHO이 답변은 제어 문자를 제거하므로 허용되는 답변보다 낫습니다.
Dean2690


11

필 크루즈의 정규 표현식 솔루션 에서 영감을 얻어 순수한 LINQ 솔루션을 만들었습니다.

public static string PureAscii(this string source, char nil = ' ')
{
    var min = '\u0000';
    var max = '\u007F';
    return source.Select(c => c < min ? nil : c > max ? nil : c).ToText();
}

public static string ToText(this IEnumerable<char> source)
{
    var buffer = new StringBuilder();
    foreach (var c in source)
        buffer.Append(c);
    return buffer.ToString();
}

이것은 테스트되지 않은 코드입니다.


1
이해하지 못한 사람들에게 이것은 C # 4.0 LINQ 기반 솔루션입니다. :)

7
별도의 ToText () 메소드 대신 PureAscii ()의 3 행을 다음과 같이 바꾸는 방법은 다음과 같습니다. return new string (source.Select (c => c <min? nil : c> max? nil : c) .ToArray ()) ;
agentnega

또는 ToText as : return (new string (source)). ToArray ()-가장 잘 수행되는 결과에 따라. 유창한 / 파이프 라인 스타일 인 ToText를 확장 방법으로 사용하는 것이 여전히 좋습니다. :-)
벤트 라스무센

이 코드는 비 ASCII 문자를 공백으로 바꿉니다. 이를 제거하려면 선택을 다음으로 변경하십시오.return new string( source.Where( c => c >= min && c <= max ).ToArray() );
Foozinator

@Foozinator이 코드를 사용하면 비 ASCII 문자를 대체 할 문자를 지정할 수 있습니다. 기본적으로 공백을 사용하지만 .PureASCII (Char.MinValue)와 같이 호출되면 모든 비 ASCII가 '\ 0'으로 바뀝니다. 이것은 여전히 ​​정확하게 스트리핑하지 않지만 비슷한 결과입니다.
Ulfius

5

정규식이 필요하지 않습니다. 그냥 인코딩을 사용하십시오 ...

sOutput = System.Text.Encoding.ASCII.GetString(System.Text.Encoding.ASCII.GetBytes(sInput));

5
작동하지 않습니다. 이것은 유니 코드 문자를 제거하지 않고?로 대체합니다. 캐릭터.
David

1
@David가 옳습니다. 적어도 내가 ????nacho??시도했을 때 얻었습니다 : たまねこnachoなち모노 3.4에서
nacho4d

1
문자를 바꾸는 대신 제거하는 고유 한 인코딩 클래스를 인스턴스화 할 수 있습니다. GetEncoding 방법 참조 : msdn.microsoft.com/en-us/library/89856k4b(v=vs.110).aspx
kkara

4

주석 블록을 데이터베이스에서 구문 분석하는 데 다음과 같이 약간 변경된 범위가 유용하다는 것을 알았습니다. 이는 CSV 필드를 화나게하는 탭 및 이스케이프 문자와 충돌 할 필요가 없음을 의미합니다.

parsememo = Regex.Replace(parsememo, @"[^\u001F-\u007F]", string.Empty);

다른 특수 문자 나 구두점을 피 하려면 ASCII 표를 확인하십시오 .


1
다른 사람이 다른 주석을 보지 못한 경우 인쇄 가능한 문자는 실제로 @ "[^ \ u0020- \ u007E]"입니다. 궁금한 점이
scradam

3

나는 확장 ASCII 문자에 대한 해결책을 찾기 위해 여기에 왔지만 찾을 수 없었습니다. 내가 찾은 가장 가까운 것은 bzlm 's solution 입니다. 그러나 그것은 127까지 ASCII 코드에서만 작동합니다 (분명히 코드의 인코딩 유형을 바꿀 수는 있지만 이해하기가 다소 복잡하다고 생각 하므로이 버전을 공유합니다). 여기에 작동하는 솔루션의 확장 된 ASCII 코드는 255 개까지하여 예 는 IS ISO 8859-1

ASCII가 아닌 문자를 찾아서 제거합니다 (255보다 큼)

Dim str1 as String= "â, ??î or ôu🕧� n☁i✑💴++$-💯♓!🇪🚑🌚‼⁉4⃣od;/⏬'®;😁☕😁:☝)😁😁///😍1!@#"

Dim extendedAscii As Encoding = Encoding.GetEncoding("ISO-8859-1", 
                                                New EncoderReplacementFallback(String.empty),
                                                New DecoderReplacementFallback())

Dim extendedAsciiBytes() As Byte = extendedAscii.GetBytes(str1)

Dim str2 As String = extendedAscii.GetString(extendedAsciiBytes)

console.WriteLine(str2)
'Output : â, ??î or ôu ni++$-!‼⁉4od;/';:)///1!@#$%^yz:

다음 은 코드 작동 바이올린입니다.

요구 사항에 따라 인코딩을 교체하고 나머지는 동일하게 유지해야합니다.


2
이 문자열 "Ω c ç ã"에서 Ω 만 제거하는 유일한 방법입니다. 대단히 감사합니다!
라파엘 아라우조

2

이것은 최적의 성능 측면이 아니지만 매우 간단한 Linq 접근 방식입니다.

string strippedString = new string(
    yourString.Where(c => c <= sbyte.MaxValue).ToArray()
    );

단점은 모든 "생존하는"문자가 먼저 유형의 배열에 삽입 된 char[]다음 string생성자가 더 이상 사용하지 않으면 버린다 는 것입니다.


1

이 정규식을 사용했습니다.

    string s = "søme string";
    Regex regex = new Regex(@"[^a-zA-Z0-9\s]", (RegexOptions)0);
    return regex.Replace(s, "");

16
이것은 누군가가 원하는 것이 아닌 경우를 대비하여 구두점도 제거합니다.
Drew Noakes

1

이 정규식을 사용하여 파일 이름에서 잘못된 문자를 걸러냅니다.

Regex.Replace(directory, "[^a-zA-Z0-9\\:_\- ]", "")

파일 이름에 허용되는 모든 문자 여야합니다.


1
아니. Path.GetInvalidPathCharsPath.GetInvalidFileNameChars를 참조하십시오 . 따라서 수만 개의 유효한 문자가 있습니다.
Tom Blodget 2018 년

맞습니다, 톰 나는 실제로 일반적인 것들을 생각하고 있었지만 괄호와 중괄호는 생략하고 ^^ $ # @! & + =.
user890332
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.