1

BEFORE_PROCESSINGタイトルの下に示されているように、C# で文字列入力としてテキストを入力することを期待しています。このテキストは、次のようにフォーマットする必要があります。

  1. スタイル タグのない裸のセンテンス (たとえば、センテンス 1) は、センテンス全体を太字にするためにスタイル タグを取得する必要があります。
  2. 文全体を RED で表示するには、すでにスタイル タグが設定されている文を識別し、その前景色要素を「fg:Red」に設定する必要があります。
  3. すでにスタイル タグが設定されている文には、スタイル タグがネストされている場合があります。したがって、これを考慮する必要があります。

例として、フォーマットが完了すると、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>"
4

1 に答える 1

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 ステートメントを使用して、文字列を結合するだけです。

于 2016-07-12T12:38:53.403 に答える