1

しばらくプログラミングから離れていました。フォーマットしたい文字列がいくつかあります。それらは次のようになります。

,SUM(CASE WHEN [Level] IN('4') AND Program = 1 THEN 1 ELSE 0 END) as CNT1
,SUM(CASE WHEN [Level] IN('3') AND Program = 1 THEN 1 ELSE 0 END) as CNT2
,SUM(CASE WHEN [Level] IN('2') AND Program = 1 THEN 1 ELSE 0 END) as CNT3
,SUM(CASE WHEN [Level] IN('1') AND Program = 1 THEN 1 ELSE 0 END) as CNT4
,SUM(CASE WHEN [Level] IN('0') AND Program = 1 THEN 1 ELSE 0 END) as CNT5

私はこれを取り、それをに変えたい

,CNT1 = SUM(CASE WHEN [Level] IN('4') AND Program = 1 THEN 1 ELSE 0 END) 
,CNT2 = SUM(CASE WHEN [Level] IN('3') AND Program = 1 THEN 1 ELSE 0 END) 
,CNT3 = SUM(CASE WHEN [Level] IN('2') AND Program = 1 THEN 1 ELSE 0 END) 
,CNT4 = SUM(CASE WHEN [Level] IN('1') AND Program = 1 THEN 1 ELSE 0 END) 
,CNT5 = SUM(CASE WHEN [Level] IN('0') AND Program = 1 THEN 1 ELSE 0 END) 

multiline textbox、文字列を貼り付けた.ボタンをクリックして、2番目のテキストボックスにフォーマットしたい.

これは私がこれまでに試したことです。しかし、どの文字列関数を使用して、希望どおりにフォーマットするのかわかりません。

            List<String> Items = new List<string>();
            string frTxt;
            foreach (string lne in txtM.Lines)
            {
                frTxt = "";
                frTxt = lne;

            }  

複数行のテキストボックスはどこにありますかtxtM。ループ内で行うConsole.WriteLine(lne);と、正常にループします。

4

5 に答える 5

2

フォーマットが常にであると仮定する

、<text_1> as <text_2>

これにより、次のように変換されます。

、<text_2> = <text_1>

txtM.Lines = txtM.Lines.Select(l => Regex.Replace(l, ",(.+) as (.+?)$", ",$2 = $1")).ToArray();

正規表現の説明:

  • 「、」および「as」は、これらの正確な文字列と一致します
  • "(。+)"欲張り-少なくとも1つの文字に一致し、それを最初のグループとしてキャプチャします
  • "(。+?)"欲張りでない-少なくとも1つの文字に一致し、それを2番目のグループとしてキャプチャします
  • 「$」は行末に一致します

欲張りと非欲張りのマッチングを組み合わせた結果、「as ...」が最後に出現するように強制します(したがって、文字列のどこかに「as」が含まれている場合、それは問題ではありません)。「$」を追加することにより、2番目のキャプチャがすべてを行の最後に移動するようにします(そうでない場合、貪欲ではない一致であるため、「as」の後の最初の文字だけに一致します。これは、必要なものではありません)。

置換では、正規表現によってキャプチャされた2つのグループを使用して新しい文字列を作成し、「=」を追加します。また、正規表現が一致するため、最初に手動で「、」を追加し直します。これにより、置換文字列に置き換えられます。(これは克服できますが、おそらく正規表現をより複雑にするでしょう)。

于 2012-07-09T16:06:09.627 に答える
1

まあ、それが始まりと終わりだけなら、あなたはすることができます

myString.Replace(",", ",CNT1 = ").Replace(" as CNT1", "");

string組み込みメソッドでこれを行う方法はたくさんあります

文字列のドキュメントを確認してください


完全に機能し、テスト済みのコード スニピットを次に示します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] strArr = 
            {
            ",SUM(CASE WHEN [Level] IN('4') AND Program = 1 THEN 1 ELSE 0 END) as CNT1",
            ",SUM(CASE WHEN [Level] IN('3') AND Program = 1 THEN 1 ELSE 0 END) as CNT2",
            ",SUM(CASE WHEN [Level] IN('2') AND Program = 1 THEN 1 ELSE 0 END) as CNT3",
            ",SUM(CASE WHEN [Level] IN('1') AND Program = 1 THEN 1 ELSE 0 END) as CNT4",
            ",SUM(CASE WHEN [Level] IN('0') AND Program = 1 THEN 1 ELSE 0 END) as CNT5",
            };

            //intellisence didn't like assignment in the foreach loop
            for(int i=0; i<strArr.Length; i++)
            {
                string cnt = Regex.Match(strArr[i], @"CNT\d+$").Value;
                strArr[i] = strArr[i].Replace(",", String.Format(",{0} = ",cnt)).Replace(String.Format(" as {0}", cnt), "");
            }

            foreach(string str in strArr)
            {
                Console.WriteLine(str);
            }

        }
    }
}
于 2012-07-09T15:57:45.330 に答える
0

マルチネスでrichTextboxを使用していると想定しています。例を参照してください。

private void FormatLinesInTextBox()
{
    int cnt = 1;
    foreach (string line in richTextBox1.Lines)
    {
        string cntNumber = cntNumber = "CNT" + cnt;
        richTextBox1.Lines[cnt - 1] = "," + cntNumber + line.Replace(cntNumber, string.Empty);
        cnt++;
    }
}
于 2012-07-09T16:08:04.313 に答える
0

Regex.Replaceを正規表現の一致とRegex言語に置き換えてください。

グループ化構造を使用(...)して部分文字列を挿入する場所をキャプチャし、2番目の構造を使用して挿入する部分文字列をキャプチャします。

于 2012-07-09T15:58:44.250 に答える
0

これは非常に具体的です。入力文字列は常にその形式になりますか? その場合、次のようなものを使用できます。

        string s = textBox1.Text;
        var result = s.Split(',').ToList();
        result.ForEach(x =>
        {
            int removeAfter = x.LastIndexOf(" as CNT");
            string cntNum = x.Substring(x.LastIndexOf("CNT"), x.Length - 1);
            x = string.Format(",{0} = {1}", cntNum, x.Substring(0, removeAfter));
        });

ただし、検索と置換に正規表現を使用することを検討することを強くお勧めします。

于 2012-07-09T16:02:17.327 に答える