Печальная правда об этом посте в том, что у меня плохие навыки регулярных выражений. Недавно я наткнулся на некоторый код в старом проекте, с которым я действительно хочу что-то сделать. Вот оно:
strDocument = strDocument.Replace("font size=""1""", "font size=0.2")
strDocument = strDocument.Replace("font size='1'", "font size=0.2")
strDocument = strDocument.Replace("font size=1", "font size=0.2")
strDocument = strDocument.Replace("font size=""2""", "font size=1.5")
strDocument = strDocument.Replace("font size='2'", "font size=1.5")
strDocument = strDocument.Replace("font size=2", "font size=1.5")
strDocument = strDocument.Replace("font size=3", "font size=2")
strDocument = strDocument.Replace("font size=""3""", "font size=2")
strDocument = strDocument.Replace("font size='3'", "font size=2")
Я предполагаю, что есть некоторый простой шаблон регулярных выражений, который я мог бы использовать, чтобы найти различные способы цитирования значений атрибутов и заменить их допустимым синтаксисом. Например, если кто-то написал какой-нибудь HTML-код, похожий на:
<tag attribute1=value attribute2='value' />
Я хотел бы иметь возможность легко очистить этот тег, чтобы он выглядел как
<tag attribute1="value" attribute2="value" />
Веб-приложению, с которым я работаю, 10 лет, и существует несколько тысяч ошибок проверки из-за пропущенных кавычек и тонны другого мусора, так что если кто-нибудь сможет мне помочь, это будет здорово!
EDIT:
Я обернулся (нашел несколько примеров), и у меня есть кое-что, что будет работать, но хотелось бы, чтобы оно было немного умнее:
Dim input As String = "<tag attribute=value attribute='value' attribute=""value"" />"
Dim test As String = "attribute=(?:(['""])(?<attribute>(?:(?!\1).)*)\1|(?<attribute>\S+))"
Dim result As String = Regex.Replace(input, test, "attribute=""$2""")
Это выводит result
правильно как:
<tag attribute="value" attribute="value" attribute="value" />
Есть ли способ, которым я мог бы немного изменить (и упростить!) Это, чтобы заставить его искать любое имя атрибута?
UPDATE:
Вот то, что я пока основал на комментариях. Возможно, это можно улучшить еще больше:
Dim input As String = "<tag border=2 style='display: none' width=""100%"" />"
Dim test As String = "\s*=\s*(?:(['""])(?<g1>(?:(?!\1).)*)\1|(?<g1>\S+))"
Dim result As String = Regex.Replace(input, test, "=""$2""")
, который производит:
<tag border="2" style="display: none" width="100%" />
Есть еще предложения? В противном случае, я думаю, я ответил на свой вопрос, конечно, с вашей помощью.