C# 解析\启用";-无法识别的转义序列\E
在上面的示例中,C# 解析\启用";-无法识别的转义序列\E,c#,regex,backslash,C#,Regex,Backslash,在上面的示例中,Regex.Matches()class给出异常解析“\ENABLED”- 无法识别的转义序列\E 异常的直接原因是正则表达式和C将反斜杠(\)视为特殊符号,例如在 string line = "ena"; // pattern == "\\ENABLED"; pattern is input by user (see comments below) string pattern = Console.ReadLine(); foreach (Match match i
Regex.Matches()
class给出异常解析“\ENABLED”
-
无法识别的转义序列\E
异常的直接原因是正则表达式和C将反斜杠(\
)视为特殊符号,例如在
string line = "ena";
// pattern == "\\ENABLED"; pattern is input by user (see comments below)
string pattern = Console.ReadLine();
foreach (Match match in Regex.Matches(line, pattern,RegexOptions.CultureInvariant))
{
Console.WriteLine("match");
}
两种模式\
都有特殊的含义。因此,您必须转义\
两次(对于C#和regex):
或者(为了使模式
更具可读性),您可以将字符串转换为逐字:
const string pattern = "\\\\ENABLED";
如果是用户(见问题注释)提供了模式,我们应该准备好获得语法错误的模式;我们可以尝试捕获异常:
如果文本框中提供了模式
,也会有同样的想法:
Regex regex = null;
while (true) {
Console.WriteLine("Please, provide the pattern: ");
try {
// Try to get pattern from user
// Trim() - let's be nice and remove leading / trailing spaces
// TimeSpan.FromSeconds(10) - user can provide a very bad pattern,
// we don't want to freeze forever (10 seconds at most)
regex = new Regex(
Console.ReadLine().Trim(),
RegexOptions.CultureInvariant,
TimeSpan.FromSeconds(10));
// if pattern is syntactically valid
break;
}
catch (ArgumentException e) {
Console.WriteLine($"Pattern is invalid: {e.Message}");
}
}
// We have a valid Regex regex based on user pattern; let's use it:
try {
foreach (Match match in regex.Matches(line)) {
Console.WriteLine("match");
}
}
catch (RegexMatchTimeoutException) {
//TODO: pattern is bad one, let user know it
}
“\\\\ENABLED”代码>对于C#和Regex,必须逃逸两次。或者你可以把@“\\ENABLED”
模式,即“\\ENABLED”由用户以文本框的形式输入,因此如何在文本框中处理如果模式
是由用户输入的,它很可能是语法错误的,我们应该准备好这一点:我们必须添加异常捕获,并让用户知道模式
是错误的。
const string pattern = @"\\ENABLED";
Regex regex = null;
while (true) {
Console.WriteLine("Please, provide the pattern: ");
try {
// Try to get pattern from user
// Trim() - let's be nice and remove leading / trailing spaces
// TimeSpan.FromSeconds(10) - user can provide a very bad pattern,
// we don't want to freeze forever (10 seconds at most)
regex = new Regex(
Console.ReadLine().Trim(),
RegexOptions.CultureInvariant,
TimeSpan.FromSeconds(10));
// if pattern is syntactically valid
break;
}
catch (ArgumentException e) {
Console.WriteLine($"Pattern is invalid: {e.Message}");
}
}
// We have a valid Regex regex based on user pattern; let's use it:
try {
foreach (Match match in regex.Matches(line)) {
Console.WriteLine("match");
}
}
catch (RegexMatchTimeoutException) {
//TODO: pattern is bad one, let user know it
}
Regex regex = null;
try {
regex = new Regex(
patternTextBox.Text.Trim(),
RegexOptions.CultureInvariant,
TimeSpan.FromSeconds(10));
}
catch (ArgumentException e) {
if (patternTextBox.CanFocus)
patternTextBox.Focus();
MessageBox.Show($"Incorrect pattern: {e.Message}");
return;
}
try {
foreach (Match match in regex.Matches(line)) {
...
}
}
catch (RegexMatchTimeoutException) {
//TODO: pattern is bad one, let user know it
}