使用c#为字符串创建正则表达式模式
本文关键字:正则表达式 模式 创建 字符串 使用 | 更新日期: 2023-09-27 18:02:49
我有一个这样的字符串模式:
#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_Click(object sender, EventArgs e)
{
String ps = txtpesan.Text;
Regex rx = new Regex("((?:'d+,)*(?:'d+))x('d+)");
Match mc = rx.Match(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++;
}
regex的演示可以在这里看到。该模式匹配以逗号分隔的数字块,同时将这些数字捕获到组1中,并将x
之后的数字捕获到组2中。无法摆脱cnt
计数器,对不起。