Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET4.0中的字符串操作_C#_String - Fatal编程技术网

C# .NET4.0中的字符串操作

C# .NET4.0中的字符串操作,c#,string,C#,String,我已经有一段时间不接触编程了。我有一些字符串要格式化。它们看起来像这样: ,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)

我已经有一段时间不接触编程了。我有一些字符串要格式化。它们看起来像这样:

,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
        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));
        });
我想把这个换成

,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) 
现在我有一个
多行文本框
,我将字符串粘贴到其中。我想单击一个按钮并将其格式化为第二个文本框

这就是我到目前为止所尝试的。但是我不确定用什么字符串函数来格式化它

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

            }  
List Items=newlist();
字符串frTxt;
foreach(txtM.行中的字符串lne)
{
frTxt=“”;
frTxt=lne;
}  

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

好吧,如果只是开始和结束,你可以这样做

myString.Replace(",", ",CNT1 = ").Replace(" as CNT1", "");
使用内置的
string
方法可以实现这一点


下面是一个功能齐全且经过测试的代码snipit:

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

        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Text.RegularExpressions;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
字符串[]strArr=
{
“,求和(当('4')中的[Level]和Program=1时,则为1,否则为0结束)作为CNT1”,
“,求和(当('3')中的[Level]和Program=1时,则为1,否则为0结束)为CNT2”,
“,求和(当('2')中的[Level]和Program=1时,则为1,否则为0结束),作为CNT3”,
“,求和(当('1')中的[Level]和Program=1时,则为1,否则为0结束)为CNT4”,
“,求和(当('0')中的[Level]和Program=1时,则为1,否则为0结束)为CNT5”,
};
//intellisence不喜欢foreach循环中的赋值
对于(inti=0;i检查正则表达式是否匹配和


您希望使用分组构造来捕获插入子字符串的位置,并使用第二个构造来捕获要插入的子字符串。

这是非常具体的。您的输入字符串是否总是采用这种格式?在这种情况下,您可以使用类似以下内容:

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

但是我强烈建议使用正则表达式来搜索和替换

,作为

以下内容将其转换为:

,=

正则表达式的解释:

  • “,”和“as”匹配那些精确的字符串
  • (.+)“贪婪”至少匹配一个字符,并将其捕获为第一组
  • “(.+?)”非贪婪匹配至少一个字符,并将其捕获为第二组
  • “$”匹配行的结尾
结合贪婪匹配和非贪婪匹配的结果是,我们强制“As…”成为最后一个匹配项(因此,如果字符串中的某个地方碰巧包含“As”,这无关紧要)。通过添加“$”我们确保第二次捕获将所有内容都带到行的末尾(否则,因为它是非贪婪匹配,所以它只匹配“as”之后的第一个字符,这不是我们想要的)


替换只是使用正则表达式捕获的两个组构造新字符串,添加“=”。我们还手动在开始时添加“,”,因为正则表达式与之匹配,因此它将被替换字符串替换。(这可以克服,但可能会使正则表达式更复杂).

我假设您使用的是带有Multine的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++;
    }
}

你可以使用正则表达式。到目前为止,你尝试过什么?现在有什么不起作用?你的字符串构造是否正确,如果没有,怎么会不正确?你是否至少看了?+1。你可能想展示如何根据示例构造搜索和替换字符串。它看起来像CNT1-CNT5m,而不仅仅是CNT1。我不是我不确定我的模式是什么?是“as”部分更改。即,列名不同。Iridium的代码工作完美无瑕。只是想寻找解释。这很完美。你能解释正则表达式模式是如何工作的吗?@masfenix在回答中添加了一个描述。谢谢。我知道我可以用谷歌搜索这个,但贪婪和非贪婪的“贪婪”有什么区别匹配尽可能多的输入以使正则表达式匹配,相反,“非贪婪”匹配尽可能少的输入。