RegEx для тегов <li></li> - PullRequest
       1

RegEx для тегов <li></li>

4 голосов
/ 21 декабря 2010

Я работаю над приложением 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 ]

2 голосов
/ 21 декабря 2010

Это работает на вашем конкретном примере, но вполне может нарушить другие входные данные (например, если теги <li> должны были занимать разрывы строк), поэтому, если это не дает желаемых результатов, отредактируйте ваш вопрос с более подробной информацией.1002 *

cleanString = Regex.Replace(subjectString, "(?:</li>)+", "", RegexOptions.IgnoreCase);
resultString = Regex.Replace(cleanString, "<li>(.*)", "<li>$1</li>", RegexOptions.IgnoreCase);
2 голосов
/ 21 декабря 2010

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

Попробуйте ниже, вы можете реализовать свой собственный код

   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;
1 голос
/ 24 декабря 2010

публичная строка 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 секунд, чтобы заменить все теги ..

0 голосов
/ 06 января 2011
        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);


        }
0 голосов
/ 24 декабря 2010

Это не самое красивое решение вашей проблемы, но оно быстро сходит с ума.Регулярные выражения медленны по сравнению с прямыми строковыми методами.

Мой метод строк сравнивается с двумя регулярными выражениями Тима Пицкера.(Извините, Тим, я должен был выбрать кого-то, и у вас есть повышенный голос :))

это с 10 000 повторений.числа - число прошедших тиков:

регулярное выражение заменить: среднее значение: 40,9659.макс: 2273

замена строки: средняя: 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;
}
0 голосов
/ 21 декабря 2010
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>");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...