正则表达式 - 第一组 1 次,第二组多次
Regex - 1st group 1 time, 2nd group Multiple times
我有这样的数据 -
06deepaksharma
我需要正则表达式将数据拆分为
06 > then multiple group of (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 次。
UPDATE BELOW ---
所以如果我们不能将长度应用于第二组,那么如果我说我固定第二组的长度,我们是否可以获得所有可能性?
意味着如果字符组的长度为 2
01DE > 01 DE
01DEEPAK > 01 DE EP AK
XXDEEP > XX DE EP
因此,如果我们说长度始终为 2,那么现在可以获得 UPDATED
部分
中所述的预期结果
我认为您不能在此处使用正则表达式,因为您需要使用具有变量值的反向引用。
但是您可以考虑对字符进行简单的 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()));
您可以使用正则表达式和 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(".{{{0}}}", int.Parse(mtch.Groups[1].Value)))
.Cast<Match>()
.Select(p => p.Value)
.ToList();
result.AddRange(chunks);
正则表达式 ^(\d+)(.*)
匹配开头的任何数字(第 1 组),然后捕获单行字符串的其余部分(没有换行符,如果要支持它们,请添加 RegexOptions.Singleline
标志到 Regex.Match
) 进入第 2 组。
以上代码执行结果:
如果您的字符串的字母数不能除以初始数字而没有余数,请使用 ".{{1,{0}}}"
.
而不是 ".{{{0}}}"
我有这样的数据 -
06deepaksharma
我需要正则表达式将数据拆分为
06 > then multiple group of (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 次。
UPDATE BELOW ---
所以如果我们不能将长度应用于第二组,那么如果我说我固定第二组的长度,我们是否可以获得所有可能性?
意味着如果字符组的长度为 2
01DE > 01 DE
01DEEPAK > 01 DE EP AK
XXDEEP > XX DE EP
因此,如果我们说长度始终为 2,那么现在可以获得 UPDATED
部分
我认为您不能在此处使用正则表达式,因为您需要使用具有变量值的反向引用。
但是您可以考虑对字符进行简单的 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()));
您可以使用正则表达式和 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(".{{{0}}}", int.Parse(mtch.Groups[1].Value)))
.Cast<Match>()
.Select(p => p.Value)
.ToList();
result.AddRange(chunks);
正则表达式 ^(\d+)(.*)
匹配开头的任何数字(第 1 组),然后捕获单行字符串的其余部分(没有换行符,如果要支持它们,请添加 RegexOptions.Singleline
标志到 Regex.Match
) 进入第 2 组。
以上代码执行结果:
如果您的字符串的字母数不能除以初始数字而没有余数,请使用 ".{{1,{0}}}"
.
".{{{0}}}"