在 C# 中解析嵌套的 CSS-styled 文本
Parsing nested CSS-styled text in C#
我希望在 C# 中将文本作为字符串输入,如 BEFORE_PROCESSING 标题下所示。此文本需要格式化为:
- 没有任何样式标签的裸句(例如句子1)必须得到一个样式标签才能使整个句子成为粗体。
- 需要识别已经有style标签的句子,其前景色元素必须设置为"fg:Red",才能让整个句子看起来红色。
- 已经有样式标签的句子可能有嵌套的样式标签。因此,需要考虑这一点。
例如,格式化完成后,BEFORE_PROCESSING标题中的句子应该看起来像AFTER_PROCESSING[下的文字=36=].
我的问题是在 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>"
您可以尝试以下基于正则表达式的解决方案:
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 语句。
我希望在 C# 中将文本作为字符串输入,如 BEFORE_PROCESSING 标题下所示。此文本需要格式化为:
- 没有任何样式标签的裸句(例如句子1)必须得到一个样式标签才能使整个句子成为粗体。
- 需要识别已经有style标签的句子,其前景色元素必须设置为"fg:Red",才能让整个句子看起来红色。
- 已经有样式标签的句子可能有嵌套的样式标签。因此,需要考虑这一点。
例如,格式化完成后,BEFORE_PROCESSING标题中的句子应该看起来像AFTER_PROCESSING[下的文字=36=].
我的问题是在 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>"
您可以尝试以下基于正则表达式的解决方案:
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 语句。