RegEx для тегов <li></ li>
Я работаю над приложением C# WinForm. В этом приложении у меня есть такой фрагмент кода:
<ul>
<li>abc
<li>bbc
<li>xyz
<li>pqr </li></li></li></li>
</ul>
но я хочу получить вывод, как..
<ul>
<li>abc</li>
<li>bbc</li>
<li>xyz</li>
<li>pqr</li>
</ul>
Есть ли метод, с помощью которого эта вещь может быть сделано?
Кто-нибудь может предложить мне RegEx для этой проблемы?
Благодарю. С уважением.
6 ответов
Это просто без использования каких-либо необычных регулярных выражений
Попробуйте ниже, вы можете реализовать свой собственный код
1. first Remove all </li>'s from the snippet
line.replace("</li>","")
2. Read each line starts with <li>
if (line.startswith("<li">)
3. and append the </li> at the end
line+ ="</li>"
4. combine all the line
resString += line;
Это работает на вашем конкретном примере, но вполне может нарушить другие входные данные (например, если <li>
теги должны были занимать разрывы строк), поэтому, если это не дает желаемых результатов, отредактируйте свой вопрос с более подробной информацией.
cleanString = Regex.Replace(subjectString, "(?:</li>)+", "", RegexOptions.IgnoreCase);
resultString = Regex.Replace(cleanString, "<li>(.*)", "<li>$1</li>", RegexOptions.IgnoreCase);
Открытая строка AddLiandOl(строка xhtml) {
xhtml = xhtml.Replace("</li>", string.Empty);
xhtml = xhtml.Replace("<li>", "</li><li>");
xhtml = xhtml.Replace("</ol>", "</li></ol>");
xhtml = xhtml.Replace("</ul>", "</li></ul>");
Regex replaceul = new Regex("<ul>(.+?)</li>", RegexOptions.IgnoreCase | RegexOptions.Singleline);
xhtml = replaceul.Replace(xhtml,"<ul>");
Regex replaceol = new Regex("<ol>(.+?)</li>", RegexOptions.IgnoreCase | RegexOptions.Singleline);
xhtml = replaceol.Replace(xhtml, "<ol>");
return xhtml;
}
Попробуйте это, я проверил это. это работает... Едва ли требуется 30 секунд, чтобы заменить все теги..
string unorderlist = "<ul><li>ONE</li><li>TWO</li><li>THREE</li></ul>";
Regex regexul = new Regex("<ul>");
Match m = regexul.Match(unorderlist);
if (m.Success)
{
unorderlist = regexul.Replace(unorderlist, string.Empty);
Regex regex1 = new Regex("<li>");
unorderlist = regex1.Replace(unorderlist, ":");
Regex regex2 = new Regex("</li>");
unorderlist = regex2.Replace(unorderlist, "\n");
Regex regex3 = new Regex("</ul>");
unorderlist = regex3.Replace(unorderlist, "\n");
Console.WriteLine(unorderlist);
}
StringBuilder output = new StringBuilder("<ul>\n");
foreach (i in Regex.Matches(snippet, "<li>\\w*"))
{
output.Append(i.Value).Append("</li>\n");
}
output.Append("\n</ul>");
Это не самое красивое решение вашей проблемы, но быстро сумасшедшее. Регулярные выражения медленны по сравнению с прямыми методами.
Мой метод строк по сравнению с двумя Regex.Replace Тима Пицкера. (Извините, Тим, мне пришлось кого-то ковырять, а у вас есть upvote:))
это с 10 000 повторений. числа - число прошедших тиков:
регулярное выражение заменить: средняя: 40,9659. макс: 2273
строка заменяет: avg: 18.4566. макс: 1478
string strOrg = "<ul>\n" +
"<li>abc\n" +
"<li>bbc\n" +
"<li>xyz\n" +
"<li>pqr </li></li></li></li>\n" +
"</ul>";
string strFinal = FixUnorderedList(strOrg);
public static string FixUnorderedList(string str)
{
//remove what we're going to put back later
//(these could be placed on the same line, one after the other)
str = str.Replace("\n", string.Empty);
str = str.Replace("</li>", string.Empty);
str = str.Replace("<ul>", string.Empty);
str = str.Replace("</ul>", string.Empty);
//get each li element
string[] astrLIs = str.Split(new string[] { "<li>" }, StringSplitOptions.RemoveEmptyEntries);
//rebuild the list correctly
string strFinal = "<ul>";
foreach(string strLI in astrLIs)
strFinal += string.Format("\n<li>{0}</li>", strLI.Trim());
strFinal += "\n</ul>";
return strFinal;
}