如何将具有无序列表的字符串解析为通用字符串列表?
How do I parse a string with an unordered list into a generic list of strings?
我有一个无序列表作为字符串存储在我的 SQL table 中。我需要稍后在 Excel 文件中显示它,但我无法正确格式化它。
我尝试过使用正则表达式,我认为我很接近,但我遗漏了一些东西。
这是我的示例输入字符串
<ul>
<li>Line 1</li>
<li>Line 2</li>
<li>Line 3</li>
<li>Line 4
<ul style="list-style-type:circle">
<li>Line 4-1</li>
<li>Line 4-2
<ul style="list-style-type:square">
<li>Line 4-2-1</li>
<li>Line 4-2-2</li>
<li>Line 4-2-3</li>
</ul>
</li>
<li>Line 4-3</li>
</ul>
</li>
<li>Line 5</li>
<li>Line 6</li>
<li>Line 7</li>
</ul>
这是我到目前为止所做的。
var dt = new DataTable();
dt.Columns.Add();
string inputValue; //unordered list from above
Regex rgxLI = new Regex(@"<li>(.*?)</li>");
Regex rgxCircle = new Regex(@"<ul style=\""list-style-type:circle\"">(.*?)</ul>");
Regex rgxSquare = new Regex(@"<ul style=\""list-style-type:square\"">(.*?)</ul>");
MatchCollection mcLI = rgxLI.Matches(inputValue);
for (var i = 0; i < mcLI.Count; i++)
{
DataRow dr = dt.NewRow();
//string instructionLine = mc[i].Value;
if (mcLI[i].Value.Contains("<ul style=\"list-style-type:circle\">"))
{
MatchCollection mcCircle = rgxCircle.Matches(mcLI[i].Value);
for (var j = 0; j < mcCircle.Count; j++)
{
if (mcLI[j].Value.Contains("<ul style=\"list-style-type:square\">"))
{
MatchCollection mcSquare= rgxSquare.Matches(mcLI[j].Value);
dr[0] = System.Net.WebUtility.HtmlDecode("▪" + mcSquare[j].ToString().Replace("<li>", "").Replace("</li>", ""));
}
else
{
dr[0] = System.Net.WebUtility.HtmlDecode("•" + mcCircle[j].ToString().Replace("<li>", "").Replace("</li>", ""));
}
}
}
else
{
dr[0] = System.Net.WebUtility.HtmlDecode(mcLI[i].Value.Replace("<li>", "").Replace("</li>", ""));
}
dt.Rows.Add(dr);
}
不确定我是不是把事情搞得太复杂了,还是只是漏掉了一些步骤。我能够解析大部分字符串,但在 4-1 之后缺少要点。
你可以试试这个:
List<string> list = new List<string>();
list = (Regex.Split(YOURSTRING, "\r\n")).ToList<string>();
这应该按每一行分开。
它将拆分成一个数组,这就是我使用 .ToList() 的原因。
"\r\n" 用于使用 Regex
查找换行符
我有一个无序列表作为字符串存储在我的 SQL table 中。我需要稍后在 Excel 文件中显示它,但我无法正确格式化它。
我尝试过使用正则表达式,我认为我很接近,但我遗漏了一些东西。
这是我的示例输入字符串
<ul>
<li>Line 1</li>
<li>Line 2</li>
<li>Line 3</li>
<li>Line 4
<ul style="list-style-type:circle">
<li>Line 4-1</li>
<li>Line 4-2
<ul style="list-style-type:square">
<li>Line 4-2-1</li>
<li>Line 4-2-2</li>
<li>Line 4-2-3</li>
</ul>
</li>
<li>Line 4-3</li>
</ul>
</li>
<li>Line 5</li>
<li>Line 6</li>
<li>Line 7</li>
</ul>
这是我到目前为止所做的。
var dt = new DataTable();
dt.Columns.Add();
string inputValue; //unordered list from above
Regex rgxLI = new Regex(@"<li>(.*?)</li>");
Regex rgxCircle = new Regex(@"<ul style=\""list-style-type:circle\"">(.*?)</ul>");
Regex rgxSquare = new Regex(@"<ul style=\""list-style-type:square\"">(.*?)</ul>");
MatchCollection mcLI = rgxLI.Matches(inputValue);
for (var i = 0; i < mcLI.Count; i++)
{
DataRow dr = dt.NewRow();
//string instructionLine = mc[i].Value;
if (mcLI[i].Value.Contains("<ul style=\"list-style-type:circle\">"))
{
MatchCollection mcCircle = rgxCircle.Matches(mcLI[i].Value);
for (var j = 0; j < mcCircle.Count; j++)
{
if (mcLI[j].Value.Contains("<ul style=\"list-style-type:square\">"))
{
MatchCollection mcSquare= rgxSquare.Matches(mcLI[j].Value);
dr[0] = System.Net.WebUtility.HtmlDecode("▪" + mcSquare[j].ToString().Replace("<li>", "").Replace("</li>", ""));
}
else
{
dr[0] = System.Net.WebUtility.HtmlDecode("•" + mcCircle[j].ToString().Replace("<li>", "").Replace("</li>", ""));
}
}
}
else
{
dr[0] = System.Net.WebUtility.HtmlDecode(mcLI[i].Value.Replace("<li>", "").Replace("</li>", ""));
}
dt.Rows.Add(dr);
}
不确定我是不是把事情搞得太复杂了,还是只是漏掉了一些步骤。我能够解析大部分字符串,但在 4-1 之后缺少要点。
你可以试试这个:
List<string> list = new List<string>();
list = (Regex.Split(YOURSTRING, "\r\n")).ToList<string>();
这应该按每一行分开。 它将拆分成一个数组,这就是我使用 .ToList() 的原因。
"\r\n" 用于使用 Regex
查找换行符