Многоуровневый .Net Regex - PullRequest
1 голос
/ 11 февраля 2010

Если у меня есть входная строка в C #, как я могу выполнить серию операций Regex / linq над ней, чтобы сопоставить регулярное выражение с одним фрагментом строки, а затем с другим регулярным выражением все фрагменты строки, которые не совпадают с первым регулярным выражением. 1001 *

Другими словами, для входной строки:

<!-- Lorem ipsum dolor sit amet, consectetur adipiscing elit -->  
<!-- The quick brown fox jumps over the lazy dog -->
Lorem ipsum dolor sit amet, consectetur adipiscing elit 
The quick brown fox jumps over the lazy  dog
<!-- Lorem ipsum dolor sit amet, consectetur adipiscing elit -->  
<!-- The quick brown fox jumps over the lazy dog -->
Lorem ipsum dolor sit amet, consectetur adipiscing elit
The quick brown fox jumps over the lazy dog

Я хочу использовать Regex1 для сопоставления строк с <!-- --> и выполнять с ними определенные операции без дальнейшего их анализа. И иметь Regex2 для сопоставления вещей в кусочках строки, которые не совпадают с Regex1, например, чтобы найти все слова «лиса» и «собака» в этих строках и выполнить определенные операции над этими словами.

Как лучше всего комбинировать операции Regex / linq в такой ситуации?

1 Ответ

1 голос
/ 11 февраля 2010

Вам повезло, так как .NET поддерживает просмотр с переменной длиной.

Поэтому вы можете использовать два регулярных выражения в последовательности.

Сначала используйте

^<!--(.*)-->\s*$

найти все строки комментариев.Обратная ссылка $1 будет содержать все, что находится между разделителями.Например:

Regex paragraphs = new Regex(@"^<!--(.*)-->\s*$", RegexOptions.Multiline);
Match matchResults = paragraphs.Match(subjectString);
while (matchResults.Success) {
    // matched text: matchResults.Value
    // match start: matchResults.Index
    // match length: matchResults.Length
    matchResults = matchResults.NextMatch();

Во-вторых, чтобы найти и манипулировать "собакой" и "лисой" в других строках, вы можете использовать

(?<!^<!--.*)(dog|fox)

Что это регулярное выражение означает "Match dog или fox, если строка не начинается с <!-- ".Поэтому, если вы хотите заменить их, скажем, на «кошка», используйте

resultString = Regex.Replace(subjectString, "(?<!^<!--.*)(dog|fox)", "cat", RegexOptions.Multiline);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...