Непосредственная причина исключения состоит в том, что регулярные выражения , а также C # обрабатывают обратную косую черту (\
) как специальный символ , например в
\bABC\p{L}
шаблон оба \
имеют особое значение. Таким образом, вы должны сбежать \
дважды (для C # и для регулярных выражений):
const string pattern = "\\\\ENABLED";
или (чтобы сделать pattern
более читабельным) вы можете превратить строку в дословную:
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
}
Та же идея, если pattern
указано в TextBox
:
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
}