簡體   English   中英

.net 4.0中的字符串操作

[英]String Manipulation in .net 4.0

我已經與編程脫節了一段時間。 我有一些我想格式化的字符串。 它們看起來像這樣:

,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 ,我粘貼了字符串。我想點擊一個按鈕,並將其格式化為第二個文本框。

這是我到目前為止所嘗試的。 但我不確定使用什么字符串函數格式化我想要的方式。

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

            }  

其中txtM是多行文本框。 如果我做Console.WriteLine(lne); 在循環中,它成功循環。

假設格式總是如此

,<text_1>為<text_2>

以下將把它轉換為:

,<text_2> = <text_1>

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

正則表達式的解釋:

  • “,”和“as”匹配那些確切的字符串
  • “(。+)”貪婪地匹配至少一個角色,並將其捕獲為第一組
  • “(。+?)”非貪婪匹配至少一個字符並將其捕獲為第二組
  • “$”匹配行尾

由於結合了貪婪和非貪婪的匹配,我們強制“as ...”成為最后一次出現(所以如果字符串碰巧在其中的某處包含“as”,則無關緊要)。 通過添加“$”,我們確保第二次捕獲將所有內容都帶到行尾(否則因為它是非貪婪的匹配,它只匹配“as”之后的第一個字符,這不是我們想要的)。

替換只是使用正則表達式捕獲的兩個組構造新字符串,添加“=”。 我們還在開始時手動添加“,”,因為我們的正則表達式匹配它,因此它將替換為替換字符串。 (這可以克服,但可能會使正則表達式更復雜)。

好吧,如果它只是開始和結束那里,你可以做到

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

使用內置string方法有很多方法可以做到這一點

查看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);
            }

        }
    }
}

查看正則表達式匹配和Regex語言的 Regex.Replace

您希望使用分組構造(...)來捕獲插入子字符串的位置,並使用第二個來捕獲要插入的子字符串。

這是非常具體的。 您的輸入字符串是否始終具有該格式? 在這種情況下,您可以使用以下內容:

        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));
        });

但我強烈建議使用正則表達式來搜索和替換。

我假設您正在使用帶有多線程的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++;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM