簡體   English   中英

使用C#為字符串創建正則表達式模式

[英]Create Regex Pattern for String using C#

我有這樣的字符串模式:

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

我一直在使用splitreplace但無濟於事。 在嘗試解決此問題之后,我看到許多人使用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計數器,對不起。

暫無
暫無

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

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