在C#中解析嵌套的CSS样式文本

时间:2016-07-12 06:59:59

标签: c# css string-parsing css-parsing

我希望在C#中将文本作为字符串输入,如 BEFORE_PROCESSING 标题下所示。此文本需要格式化为:

  1. 没有任何样式标签的裸体句子(例如,句子1)必须获得样式标记,以使整个句子变为粗体
  2. 需要识别已经具有样式标记的句子,并且必须将其前景色元素设置为“fg:Red”,以使整个句子以红色显示。
  3. 已经拥有样式标记的句子可能具有嵌套样式标记。因此,需要考虑这一点。
  4. 例如,格式化完成后, BEFORE_PROCESSING 标题中的句子应该与 AFTER_PROCESSING 下的文字类似。

    我的问题是在C#中实现此文本处理业务的最有效方法是什么?它会使用正则表达式还是过度杀伤?您认为可能存在更好的替代方案吗?谢谢。

    (我正在使用C#4)

    BEFORE_PROCESSING

    "Sentence 1 <style styles='B;fg:Green'>STYLED SENTENCE</style> Sentence 2"
    

    AFTER_PROCESSING

    "<style styles='B'>Sentence 1 </style> 
     <style styles='B;fg:Red'>STYLED  SENTENCE</style>  
     <style styles='B'>Sentence 2</style>"
    

1 个答案:

答案 0 :(得分:0)

您可以根据正则表达式尝试以下解决方案:

string myLine = "Sentence 1<style styles='B;fg:Green'>STYLED SENTENCE</style>Sentence 2";
const string splitLinesRegex = @"((?<Styled>\<style[^\>]*\>[^\<\>]*\</style\>)|(?<NoStyle>[^\<\>]*))";

var splitLinesMatch = Regex.Matches(myLine, splitLinesRegex, RegexOptions.Compiled);
List<string> styledLinesBis = new List<string>();

foreach (Match item in splitLinesMatch)
{
    if (item.Length > 0)
    {
        if (!string.IsNullOrEmpty(item.Groups["Styled"].Value))
            styledLinesBis.Add(string.Format("<style styles='B'>{0}</style> ", item.Groups["Styled"].Value));

        if (!string.IsNullOrEmpty(item.Groups["NoStyle"].Value))
            styledLinesBis.Add(string.Format("<style styles='B;fg:Red'>{0}</style>  ", item.Groups["NoStyle"].Value));
    }
}

你只需要使用string.Join语句加入字符串。