正则表达式 - 第1组1次,第2组多次

时间:2015-09-22 06:26:28

标签: c# regex c#-4.0 string-split

我有像 -

这样的数据
  

06deepaksharma

我需要正则表达式将数据拆分为

  

06>然后多组(06 char)

所以它会像 先是2位数,然后是多个组,每组的长度都是前2位数。

01DE     >     01   D     E                        01 - then 2 group each 1 char length
02DE     >     02   DE                             02 - then 1 group each 2 char length
02DESH   >     02   DE    SH                       02 - then 2 group each 2 char length
03DEESHA >     03   DEE   SHA                      03 - then 2 group each 3 char length
01DEESHA >     01   D     E     E    S    H   A    01 - then 6 group each 1 char length

希望现在清楚我想要的东西。 我没有得到如何根据第一组值确定第二组的长度以及如何定义第二组可能出现N次。

  

以下更新---

所以,如果我们不能在第二组上应用长度,那么如果我说我修复第二组的长度,我们是否可以获得所有可能性?

表示如果char组的长度为2

01DE        >  01   DE
01DEEPAK    >  01   DE  EP   AK
XXDEEP      >  XX   DE  EP

因此,如果我们说长度一直是2,那么现在可以得到UPDATED部分

中所述的预期结果

2 个答案:

答案 0 :(得分:1)

我不认为你可以在这里使用正则表达式,因为你需要使用带有变量值的后向引用。

但是你可以考虑在字符上使用简单的linq:

// first get the number of characters to read
int num = Convert.ToInt32(myString.Substring(0, 2));

// now a simple loop on the characters
for(int i = 2; i < myString.Length; i += num) result.Add(myString.SubString(i, num);

或者,如果你真的想要一个正则表达式首先解析数字然后应用你的正则表达式:

var r = "([a-zA-Z]{" + num + "})";
var res = new Regex(r).Split(new string(myString.Skip(2).ToArray()));

答案 1 :(得分:1)

您可以使用正则表达式和LINQ实现您在问题开头所描述的内容:

var input = "03DEESHA";
var result = new List<string>();
var mtch = Regex.Match(input, @"^(\d+)(.*)"); // Get the Match object with captured texts
result.Add(mtch.Groups[1].Value);             // Add the number to the resulting list
var chunks = Regex.Matches(mtch.Groups[2].Value,   // Get all chunks
   string.Format(".{enter image description here}", int.Parse(mtch.Groups[1].Value)))
          .Cast<Match>()
          .Select(p => p.Value)
          .ToList();
result.AddRange(chunks);

正则表达式^(\d+)(.*)匹配开头的任何数字(组1),然后捕获单行字符串的其余部分(没有换行符,如果要支持它们,请添加{{1} } {标记到RegexOptions.Singleline)到第2组。

上述代码执行的结果:

{{0}}

如果您有字符串,其中字母数不能除以初始数字而没有余数,而不是Regex.Match使用".{{{0}}}"