-3

我在 C# 中使用正则表达式时遇到问题,或者至少我认为这将是我的问题的解决方案,例如,我有这个字符串:

"转到原始预算屏幕,\n1- 检查原始预算是否为原始预算 CV\n- 检查剩余预算是否为剩余预算 CV\n- 检查新字段汇率\n- 检查新字段原始预算 FC \n- 检查新字段 Remaining Budget FC \n2- 检查每周详细信息下的重命名字段:\n- 检查 In Flow 是否为 In Flow CV \n- 检查 Out Flow 是否为 Out Flow CV \n- 检查新字段 In Flow FC\n- 检查新领域 Out Flow FC"

我需要它:

转到原始预算屏幕

  • 检查原始预算是否为原始预算 CV
    • 检查剩余预算是否为剩余预算 CV
    • 检查新字段汇率
    • 检查新字段原始预算 FC
    • 检查新字段剩余预算 FC
  • 检查每周详细信息下的重命名字段:
    • 检查 In Flow 是否为 In Flow CV
    • 检查 Out Flow 是否为 Out Flow CV
    • 在 Flow FC 中检查新字段
    • 检查新字段 Out Flow FC

因此,如果简单示例没有收到消息,我想在该字符串中添加<li><ul>标记,以便我可以在 Web 应用程序上使用它

这是我的一个简单的代码:

  private string regexmethod(string field)
    {
        string strRegex = @"^(.+?)\\n[\d|\w]-\W+";
        Regex CatchBetweenTheFirstDot = new Regex(@"\\n[\d|\w]-\W+(.+?)\\n[\d|\w]-\W+");
        Regex CatchTheNumbers = new Regex(@"\\n[\d|\w]-\W+");
        Regex CatchFirstLineBeforDot = new Regex(strRegex);
        Regex CatchInsideFirstRegex = new Regex(@"\\n-\W+");
        var matchFirst = CatchFirstLineBeforDot.Matches(field);
        var matchBetween = CatchBetweenTheFirstDot.Matches(field);
        StringBuilder str = new StringBuilder();
        if (matchFirst.Count > 0)
            str.Append(matchFirst[0].Value);
        foreach (Match matchItem in matchBetween)
        {
            str.Append("<ul><li>");
            string newvalue = matchItem.Value;
            var matchTheInside = CatchInsideFirstRegex.Matches(newvalue);
            for (int i = 0; i < matchTheInside.Count; i++)
            {
                if (i == 0)
                {
                    newvalue.Replace(matchTheInside[i].Value, @"<ul><li>");
                }
                else
                {
                    newvalue.Replace(matchTheInside[i].Value, @"<\li><li>");
                }
            }
            if (newvalue.Length > 0)
            {
                newvalue += "</li></ul>";
                str.Append(newvalue);
            }

        }

这是我到目前为止得到的,但它对我不起作用。

任何帮助将不胜感激。

4

1 回答 1

1

这是从文本中解析行的类:

public class ListItem
{
    public static bool TryParse(string s, out ListItem item)
    {
        item = null;
        if (!IsListItem(s) && !IsOrderedListItem(s))
            return false;

        item = new ListItem { IsOrdered = IsOrderedListItem(s),
                              Text = GetItemText(s) };
        return true;
    }

    private static bool IsListItem(string s) {
        return Regex.IsMatch(s, @"^- .*");
    }

    private static bool IsOrderedListItem(string s) {                
        return Regex.IsMatch(s, @"^\d+- .*");
    }

    private static string GetItemText(string s) {
        return s.Substring(s.IndexOf('-') + 1).Trim();
    }

    public bool IsOrdered { get; private set; }
    public int Index { get; private set; }
    public string Text { get; private set; }
    public string Html {
        get { return String.Format("<li>{0}</li>", Text); }
    }
}

最初我认为您需要在有序列表中显示有序列表项,<ol>但我删除了该部分。这是构建 html 列表的代码:

public static IEnumerable<string> CreateHtmlLists(IEnumerable<string> lines)
{
    ListItem currentItem = null;
    int listDepth = 0;

    foreach (var line in lines)
    {
        ListItem item;
        if (!ListItem.TryParse(line, out item)) {
            yield return line; // not list item, return as is
            continue;
        }

        if (currentItem == null || (currentItem.IsOrdered && !item.IsOrdered))
        {
            yield return "<ul>"; // start new nested list
            listDepth++;
        }
        else if (!currentItem.IsOrdered && item.IsOrdered)
        {
            yield return "</ul>"; // close nested list
            listDepth--;
        }

        yield return item.Html;
        currentItem = item;
    }

    while (listDepth > 0) { // close all parent lists        
        listDepth--;
        yield return "</ul>";
    }
}

和用法:

var lines = text.Split('\n');
text = String.Join("\n", CreateHtmlLists(lines));

示例文本的输出:

Go to Original Budget screen,
<ul>
<li>Check if Original Budget is Original Budget CV</li>
<ul>
<li>Check if Remaining Budget is Remaining Budget CV</li>
<li>Check new field Exchange rate</li>
<li>Check new field Original Budget FC</li>
<li>Check new field Remaining Budget FC</li>
</ul>
<li>Check renamed field under Weekly Details:</li>
<ul>
<li>Check if In Flow is In Flow CV</li>
<li>Check if Out Flow is Out Flow CV</li>
<li>Check new field In Flow FC</li>
<li>Check new field Out Flow FC</li>
</ul>
</ul>
于 2013-08-30T12:38:59.153 回答