Câu trả lời:
string s = "søme string";
s = Regex.Replace(s, @"[^\u0000-\u007F]+", string.Empty);
Đây là một giải pháp .NET thuần túy không sử dụng các biểu thức thông thường:
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)
)
);
Nó có thể trông cồng kềnh, nhưng nó phải trực quan. Nó sử dụng mã hóa .NET ASCII để chuyển đổi một chuỗi. UTF8 được sử dụng trong quá trình chuyển đổi vì nó có thể đại diện cho bất kỳ ký tự gốc nào. Nó sử dụng EncoderReplocationFallback để chuyển đổi bất kỳ ký tự không phải ASCII nào thành một chuỗi trống.
Nếu bạn không muốn tách, nhưng thực sự chuyển đổi tiếng Latin có dấu thành các ký tự không có dấu, hãy xem câu hỏi này: Làm thế nào để tôi dịch các ký tự 8 bit thành các ký tự 7 bit? (tức là Ü đến U)
Lấy cảm hứng từ giải pháp Biểu thức chính quy của philcruz , tôi đã tạo ra một giải pháp LINQ thuần túy
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();
}
Đây là mã chưa được kiểm tra.
return new string( source.Where( c => c >= min && c <= max ).ToArray() );
không cần regex. chỉ cần sử dụng mã hóa ...
sOutput = System.Text.Encoding.ASCII.GetString(System.Text.Encoding.ASCII.GetBytes(sInput));
????nacho??
khi tôi thử: たまねこnachoなち
trong mono 3,4
Tôi thấy phạm vi thay đổi một chút sau đây hữu ích để phân tích các khối nhận xét ra khỏi cơ sở dữ liệu, điều này có nghĩa là bạn sẽ không phải tranh cãi với tab và thoát các ký tự sẽ khiến trường CSV trở nên khó chịu.
parsememo = Regex.Replace(parsememo, @"[^\u001F-\u007F]", string.Empty);
Nếu bạn muốn tránh các ký tự đặc biệt khác hoặc dấu chấm câu cụ thể, hãy kiểm tra bảng ascii
Tôi đến đây để tìm giải pháp cho các ký tự ascii mở rộng, nhưng không thể tìm thấy nó. Gần nhất tôi tìm thấy là giải pháp của bzlm . Nhưng điều đó chỉ hoạt động đối với Mã ASCII tối đa 127 (rõ ràng bạn có thể thay thế loại mã hóa trong mã của mình, nhưng tôi nghĩ rằng nó hơi phức tạp để hiểu. Do đó, chia sẻ phiên bản này). Đây là một giải pháp hoạt động cho các mã ASCII mở rộng, tức là lên tới 255 , đó là ISO 8859-1
Nó tìm và loại bỏ các ký tự không phải mã ascii (lớn hơn 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:
Đây là một bí quyết làm việc cho mã
Thay thế mã hóa theo yêu cầu, phần còn lại sẽ giữ nguyên.
Đây không phải là hiệu suất tối ưu, nhưng là một cách tiếp cận Linq khá đơn giản:
string strippedString = new string(
yourString.Where(c => c <= sbyte.MaxValue).ToArray()
);
Nhược điểm là tất cả các ký tự "sống sót" trước tiên được đưa vào một mảng loại char[]
sau đó bị loại bỏ sau khi hàm string
tạo không sử dụng nữa.
Tôi đã sử dụng biểu thức regex này:
string s = "søme string";
Regex regex = new Regex(@"[^a-zA-Z0-9\s]", (RegexOptions)0);
return regex.Replace(s, "");
Tôi sử dụng biểu thức chính quy này để lọc các ký tự xấu trong tên tệp.
Regex.Replace(directory, "[^a-zA-Z0-9\\:_\- ]", "")
Đó phải là tất cả các nhân vật được phép cho tên tập tin.