Я пытаюсь очистить некоторые изворотливые атрибуты 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". Как это сделать?
Майкл
Вы должны использовать конструкцию с предварительным просмотром (сопоставить префикс, но исключить его). Таким образом, первая часть (часть "<TD
" ) не будет согласована и не будет заменена:
"(?<=<\\w*)\\s*(X:\\w*)"
Еще один способ добиться этого - использовать заменяющую строку, чтобы заменить весь матч только первой группой, игнорирующей вторую группу, содержащую дерьмо.
string sResult = Regex.Replace(sInput, @"(<\w*\s*)(X:\w*\s*)", "$1")
Это не требует каких-либо перспектив и поэтому должно быть быстрее (простой прогон показал, что он будет на порядок быстрее).
Изменение регулярного выражения, чтобы иметь + после второй группы, удалит все атрибуты X: не только первый (если это актуально).
string sResult = Regex.Replace(sInput, @"(<\w*\s*)(X:\w*\s*)+", "$1")
Вот регулярное выражение. Интересно, почему вы не делаете это, используя синтаксический анализ 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*)"