Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.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# 使用C为字符串创建正则表达式模式#_C#_Regex - Fatal编程技术网

C# 使用C为字符串创建正则表达式模式#

C# 使用C为字符串创建正则表达式模式#,c#,regex,C#,Regex,我有这样的字符串模式: #c1 12,34,222x8. 45,989,100x10. 767x55. #c1 我想将这些模式更改为: c1,12,8 c1,34,8 c1,222,8 c1,45,10 c1,989,10 c1,100,10 c1,767,55 我的C#代码: private void btnProses\u单击(对象发送者,事件参数e) { 字符串ps=txtpesan.Text; 正则表达式rx=新正则表达式(((?:\d+,)*(?:\d+)x(\d+); 匹配mc=

我有这样的字符串模式:

#c1 12,34,222x8. 45,989,100x10. 767x55. #c1
我想将这些模式更改为:

c1,12,8
c1,34,8
c1,222,8
c1,45,10
c1,989,10
c1,100,10
c1,767,55
我的C#代码:

private void btnProses\u单击(对象发送者,事件参数e)
{
字符串ps=txtpesan.Text;
正则表达式rx=新正则表达式(((?:\d+,)*(?:\d+)x(\d+);
匹配mc=接收匹配(ps);
while(mc.Success)
{
txtpesan.Text=rx.ToString();
}
}
我一直在使用
split
replace
,但都没有用。在我尝试解决这个问题后,我看到很多人使用
regex
,我尝试使用
regex
,但我不了解制作模式regex的逻辑


我应该用什么来解决这个问题呢?

有时候正则表达式不是一个好的方法——老派的方法是成功的。假设输入有效:

var tokens = txtpesan.Text.Split(' '); //or use split by regex's whitechar
var prefix = tokens[0].Trim('#');

var result = new StringBuilder();

//skip first and last token
foreach (var token in tokens.Skip(1).Reverse().Skip(1).Reverse())
{
    var xIndex = token.IndexOf("x");
    var numbers = token.Substring(0, xIndex).Split(',');
    var lastNumber = token.Substring(xIndex + 1).Trim('.');

    foreach (var num in numbers)
    {
        result.AppendLine(string.Format("{0},{1},{2}", prefix, num, lastNumber));
    }
}

var viola = result.ToString();
Console.WriteLine(viola);

下面是一个有点难看的基于正则表达式的解决方案:

var q = "#c1 12,34,222x8. 45,989,100x10. 767x55. #c1";
var results = Regex.Matches(q, @"(?:(?:,?\b(\d+))(?:x(\d+))?)+");
var caps = results.Cast<Match>()
     .Select(m => m.Groups[1].Captures.Cast<Capture>().Select(cap => cap.Value));
var trailings = results.Cast<Match>().Select(m => m.Groups[2].Value).ToList();
var c1 = q.Split(' ')[0].Substring(1);
var cnt = 0;
foreach (var grp in caps)
{
     foreach (var item in grp)
     {
         Console.WriteLine("{0},{1},{2}", c1, item, trailings[cnt]);
     }
     cnt++;
}
var q=“#c12,34222x8.45989100x10.767x55.#c1”;
var results=Regex.Matches(q,@“(?:(?:,?\b(\d+))(?:x(\d+))+”);
var caps=results.Cast()
.Select(m=>m.Groups[1].Captures.Cast().Select(cap=>cap.Value));
var trailings=results.Cast().Select(m=>m.Groups[2].Value.ToList();
var c1=q.Split(“”)[0]。子字符串(1);
var-cnt=0;
foreach(大写的var grp)
{
foreach(grp中的var项目)
{
WriteLine(“{0},{1},{2}”,c1,item,trailings[cnt]);
}
cnt++;
}

这个。模式匹配逗号分隔的数字块,同时将数字捕获到组1中,并将
x
之后的数字捕获到组2中。无法摆脱
cnt
计数器,抱歉。

正则表达式对于某些类型的任务不起作用,例如预先重复次数未知的数据。如果所有输入数据始终有3组值,以分隔。字符和你们知道的项数,用逗号分隔的字符是固定的,你们可以用它。否则最好使用String.Split()。你的输入数据总是固定的吗?输入数据并不总是固定的。有3组可能会比这还要少。谢谢你的回答,先生,我试过在“appendLine”中有一个错误,我用“appendFormat”来表示,但是结果是c1,c1,c1c1,c1,c1,c1,c1,c1,c1,c1,c1,c1,c1,c1,c1,c1替换'result.appendLine(“{0},{0}”,前缀,num,lastNumber);`带有`result.AppendLine(“{0},{1},{2}”,前缀,num,lastNumber);`@TomiTeruzI得到它,我把它改为result.AppendLine(前缀+”,“+num+”,“+lastNumber);谢谢:)