[英]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”之后的第一個字符,這不是我們想要的)。
替換只是使用正則表達式捕獲的兩個組構造新字符串,添加“=”。 我們還在開始時手動添加“,”,因為我們的正則表達式匹配它,因此它將替換為替換字符串。 (這可以克服,但可能會使正則表達式更復雜)。
好吧,如果它只是開始和結束那里,你可以做到
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);
}
}
}
}
查看正則表達式匹配和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.