Yanıtlar:
string s = "søme string";
s = Regex.Replace(s, @"[^\u0000-\u007F]+", string.Empty);
Normal ifadeler kullanmayan saf bir .NET çözümü:
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)
)
);
Bu hantal görünebilir, ancak sezgisel olmalıdır. Bir dizeyi dönüştürmek için .NET ASCII kodlamasını kullanır. Dönüştürme sırasında UTF8 kullanılır, çünkü orijinal karakterlerden herhangi birini temsil edebilir. ASCII olmayan karakterleri boş bir dizeye dönüştürmek için bir EncoderReplacementFallback kullanır.
MonsCamus'un kastettiğine inanıyorum:
parsememo = Regex.Replace(parsememo, @"[^\u0020-\u007E]", string.Empty);
Şeritlemek istemiyorsanız, ancak aksanlı latin harfleri aksanlı olmayan karakterlere dönüştürmek istiyorsanız, şu soruya bir göz atın: 8 bit karakterleri 7 bit karakterlere nasıl çeviririm? (yani Ü'den U'ya)
Philcruz'un Düzenli İfade çözümünden esinlenerek saf bir LINQ çözümü yaptım
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();
}
Bu test edilmemiş kod.
return new string( source.Where( c => c >= min && c <= max ).ToArray() );
normal ifadeye gerek yok. sadece kodlamayı kullan ...
sOutput = System.Text.Encoding.ASCII.GetString(System.Text.Encoding.ASCII.GetBytes(sInput));
????nacho??
denediğimde aldım : たまねこnachoなち
mono 3.4'te
Aşağıdaki biraz değiştirilmiş aralığı bir veritabanı dışında yorum blokları ayrıştırma için yararlı buldum, bu sekme ve CSV alanı üzülmesine neden olur kaçış karakterleri ile uğraşmak zorunda kalmayacağınız anlamına gelir.
parsememo = Regex.Replace(parsememo, @"[^\u001F-\u007F]", string.Empty);
Diğer özel karakterlerden veya belirli noktalama işaretlerinden kaçınmak istiyorsanız ascii tablosunu kontrol edin
Buraya uzun ascii karakterler için bir çözüm aramaya geldim, ama bulamadım. Bulduğum en yakın çözüm bzlm'nin çözümü . Ama bu sadece 127 kadar ASCII Kodu için çalışır (Açıkçası onun kodunda kodlama türünü değiştirebilirsiniz, ama ben anlamak için biraz karmaşık olduğunu düşünüyorum. Bu nedenle, bu sürümü paylaşma). İşte ISO 8859-1 olan 255'e kadar genişletilmiş ASCII kodları için çalışan bir çözüm
Ascii olmayan karakterleri bulur ve çıkarır (255'ten büyük)
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:
İşte kod için çalışan bir keman
Kodlamayı gereksinime göre değiştirin, geri kalanı aynı kalmalıdır.
Bu en iyi performans açısından değil, oldukça basit bir Linq yaklaşımıdır:
string strippedString = new string(
yourString.Where(c => c <= sbyte.MaxValue).ToArray()
);
Dezavantajı, tüm "hayatta kalan" karakterlerin ilk olarak bir tür diziye char[]
konmasıdır string
;
Bu normal ifade ifadesini kullandım:
string s = "søme string";
Regex regex = new Regex(@"[^a-zA-Z0-9\s]", (RegexOptions)0);
return regex.Replace(s, "");
Bir dosya adındaki bozuk karakterleri filtrelemek için bu normal ifadeyi kullanıyorum.
Regex.Replace(directory, "[^a-zA-Z0-9\\:_\- ]", "")
Dosya adları için izin verilen tüm karakterler bu olmalıdır.