Регулярное выражение в .net для исключения конкретного слова, нескольких пробелов и разрывов строк - PullRequest
1 голос
/ 20 ноября 2011

Мне нужно регулярное выражение для поиска подстроки типа

from xyzTableName     with   (  index =...  

и

from xyzTableName     (  index =...

Если ключевое слово with отсутствует, оно должно вернуть совпадение, а если with существует после ключевого слова FROM и до (, совпадения быть не должно. Все остальные слова между from и ( должны игнорироваться.

Я пробовал с выражением ниже:

    @"\bfrom.*[\s\t\n]+(?<!with)[\s\t\n]([\s\t\n]+index"

И несколько вариантов одинаковы. Я смог решить это, когда есть только нормальные / одиночные пробелы. Но когда я попытался с несколькими пробелами и переносами строк, это не удалось.

1 Ответ

1 голос
/ 20 ноября 2011

Попробуйте этот шаблон: \bfrom\b(?!.+\bwith\b)[^(]+\(\s*index

string input = @"from xyzTableName     
with   (  index =...";
string pattern = @"\bfrom\b(?!.+\bwith\b)[^(]+\(\s*index";
bool result = Regex.IsMatch(input, pattern,
                RegexOptions.Singleline | RegexOptions.IgnoreCase);

Вышеуказанное возвращает false. Измените ввод, чтобы удалить слово «с», и он вернет true. При использовании RegexOptions.Singleline метасимвол . будет соответствовать всем символам, включая символы новой строки (\n).

Распределение по шаблону:

  • \bfrom\b: точно соответствует слову «от» и использует метасимволы границы слова
  • (?!.+\bwith\b): негативный прогноз для проверки «с», и совпадение не будет выполнено, если это произойдет
  • [^(]+: класс отрицательных символов для соответствия любому символу, который не является открывающей скобкой, хотя бы один раз.
  • \(\s*index: соответствует открывающая скобка (обратите внимание, что она должна быть экранирована), любой пробел, затем слово «index»
...