#c# #regex
#c# #регулярное выражение
Вопрос:
Мне нужно использовать регулярное выражение для поиска в HTML-файле и замены href="pagename"
на href="pages/pagename"
Также href может быть отформатирован как HREF = 'pagename'
Я не хочу заменять какие-либо hrefs, которые могут быть заглавными или строчными, начинающимися с http, ftp, mailto, javascript, #
Я использую C # для разработки этого небольшого приложения.
Комментарии:
1. Итак … вы хотите, чтобы кто-то другой написал ваше регулярное выражение за вас? Почему бы просто не потратить время, чтобы изучить это самостоятельно .
2. Очень редко использую regex. Потребовалось время для этого небольшого числа, поэтому я подумал, что отправлю свой первый SOS.
Ответ №1:
Манипулирование HTML с помощью регулярных выражений не рекомендуется, поскольку HTML не является «обычным языком». Я бы настоятельно рекомендовал вместо этого использовать HTML Agility Pack. Это дает вам DOM-интерфейс для HTML.
Комментарии:
1. 1/2, если бы я мог. Хотя вы правы в том, что html не является обычным языком, данная проблема не требует синтаксического анализа, этот конкретный случай может быть решен с помощью regex.
Ответ №2:
Я не тестировал во многих случаях, но в этом случае это сработало:
var str = "href='page' href = 'www.goo' href='http://' href='ftp://'";
Console.WriteLine(Regex.Replace(str, @"href ?= ?(('|"")([a-z0-9_#.-] )('|""))", "x", RegexOptions.IgnoreCase));
Результат:
"x x href='http://' href='ftp://'"
Вам лучше сохранить резервные копии файлов перед запуском этого: P
Ответ №3:
Существует множество предостережений при использовании поиска / замены с помощью HTML и XML. Проблема в том, что существует множество допустимых вариантов синтаксиса. (и многие из них запрещены, но все еще работают!)
Но, похоже, вы хотите что-то вроде этого:
поиск
([Hh][Rr][Ee][Ff]s*=s*['"])(w )(['"])
Это означает:
[Hh]
: любой из элементов в квадратных скобках, за которым следуетs*
: любое количество пробелов (возможно, ноль),=
s*
еще есть пробелы,['"]
любой тип кавычек,w
: слово (без каких-либо косых черт или точек — если вы хотите включить,.html
тогда используйте[.w]
вместо этого),- и
['"]
: еще одна цитата любого рода.
заменить на
$1pages/$2$3
Что означает то, что указано в первой скобке, затем pages/
, затем то, что указано во втором и третьем наборах скобок.
Вам нужно будет поместить первую строку в кавычки @», а также экранировать двойные кавычки как ""
. Обратите внимание, что это не даст ничего даже отдаленно разумного, например, проверки соответствия кавычек. Предупреждение: старайтесь никогда не использовать в качестве символа «любой символ» ( .
) в такого рода регулярных выражениях, поскольку это приведет к захвату больших фрагментов текста, включая следующие кавычки, возможно, до конца файла!
смотрите руководство по регулярным выражениям для получения дополнительной информации, например http://www.regular-expressions.info/dotnet.html