C # Regex Replace, но Replace только пронумерованная подгруппа

2

Я пытаюсь очистить некоторые изворотливые атрибуты xml с помощью регулярных выражений.

Моя строка ввода - это

<TD X:NUM class=xl101P24_2>I Want to send a FAX:but not </TD>

Моя целевая строка вывода - это

<TD class=xl101P24_2>I Want to send a FAX:but not </TD>

Теперь мой код выглядит следующим образом

public static Regex regex1 = new Regex(
      "<\\w*\\s*(X:\\w*)",
    RegexOptions.IgnoreCase
    | RegexOptions.CultureInvariant
    | RegexOptions.IgnorePatternWhitespace
    | RegexOptions.Compiled
    );

public void doRegex()
{
    string InputText = @"<TD X:NUM class=xl101P24_2>I Want to send a FAX:but not </TD>";

    string result = regex1.Replace(InputText,"");

    //result now = " class=xl101P24_2>I Want to send a FAX:but not </TD>"
}

поэтому мне нужно выполнить замену, но только для замены нумерованного подзаголовка, то есть "X: NUM". Как это сделать?

Майкл

Теги:

3 ответа

5
Лучший ответ

Вы должны использовать конструкцию с предварительным просмотром (сопоставить префикс, но исключить его). Таким образом, первая часть (часть "<TD" ) не будет согласована и не будет заменена:

"(?<=<\\w*)\\s*(X:\\w*)"
  • 0
    фантастика, вот и все. для ref, последний шаблон "(? <= <\\ w * \\ s *) (X: \\ w *)"
2

Еще один способ добиться этого - использовать заменяющую строку, чтобы заменить весь матч только первой группой, игнорирующей вторую группу, содержащую дерьмо.

string sResult = Regex.Replace(sInput, @"(<\w*\s*)(X:\w*\s*)", "$1")

Это не требует каких-либо перспектив и поэтому должно быть быстрее (простой прогон показал, что он будет на порядок быстрее).

Изменение регулярного выражения, чтобы иметь + после второй группы, удалит все атрибуты X: не только первый (если это актуально).

string sResult = Regex.Replace(sInput, @"(<\w*\s*)(X:\w*\s*)+", "$1")
-2

Вот регулярное выражение. Интересно, почему вы не делаете это, используя синтаксический анализ XSL или XML (удалить атрибут): -)

public static Regex regex1 = new Regex("^<\\w*\\s*td\\w*\\s*(X:\\w*)",
RegexOptions.IgnoreCase
| RegexOptions.CultureInvariant
| RegexOptions.IgnorePatternWhitespace
| RegexOptions.Compiled
);


or "^<\\w*\\s*td\\w*\\s*(X:\\w*)"
  • 0
    Я не могу использовать синтаксический анализ XML, потому что атрибут плохо сформирован. Я пытаюсь очистить тупой необработанный текст, поэтому я могу проанализировать его как XML.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню