下面描述中连续的数字的长度规则满足:
a:连续长度需>=4.
b:必须是2的倍数.(4,6,8,10,12,14.....)所截取的都是连续的数字,混合的则不限制长度1.A1234 -> A 1234
A12345 -> A1 2345
123A123456 -> 123A 123456
1A1234567 -> 1A1 234567
12A12A2345 -> 12A12A 2345
A1234A12345 -> A 1234 A1 2345
如果开始不是连续的数字,则从字符串后往前计算连续的数字进行分割 2.12345A12345 -> 1234 [5A12345->这个按1来进行分割(分割结果:5A1 2345)]
如果开始是连续的数字,则先截取开始连数的数字,剩下的按1来进行分割3.12ABCE12A -> 12ABCE12A
如果字串中没有连续的数字则不进行截取
a:连续长度需>=4.
b:必须是2的倍数.(4,6,8,10,12,14.....)所截取的都是连续的数字,混合的则不限制长度1.A1234 -> A 1234
A12345 -> A1 2345
123A123456 -> 123A 123456
1A1234567 -> 1A1 234567
12A12A2345 -> 12A12A 2345
A1234A12345 -> A 1234 A1 2345
如果开始不是连续的数字,则从字符串后往前计算连续的数字进行分割 2.12345A12345 -> 1234 [5A12345->这个按1来进行分割(分割结果:5A1 2345)]
如果开始是连续的数字,则先截取开始连数的数字,剩下的按1来进行分割3.12ABCE12A -> 12ABCE12A
如果字串中没有连续的数字则不进行截取
string pattern = @"(?=\d*4\d*)(\d{2}){2,}|.+?(?=\d*4\d*)(?=(\d{2}){2,}(?!\d))";
Regex regex = new Regex(pattern, RegexOptions.Compiled | RegexOptions.ExplicitCapture);
foreach (string str in strings)
{
Console.Write("\n{0}\t->\t", str);
MatchCollection mc = regex.Matches(str);
if (mc.Count == 0)
{
Console.Write(str);
}
else
{
foreach (Match m in mc)
{
Console.Write("{0} ", m.Value);
}
}
}
Regex reg = new Regex(@"(\d{4}(?:\d{2})*)", RegexOptions.RightToLeft);
foreach (string src in test)
{
richTextBox2.Text += src.PadRight(12, ' ') + "-> ";
foreach (string s in reg.Split(src))
{
richTextBox2.Text += s + " ";
}
richTextBox2.Text += "\n";
}
/*---------输出-----------
A1234 -> A 1234
A12345 -> A1 2345
123A123456 -> 123A 123456
1A1234567 -> 1A1 234567
12A12A2345 -> 12A12A 2345
A1234A12345 -> A 1234 A1 2345
*/
我把楼主的要求看成:分隔数中必须带有一个数字:4你可以用过客那个,或者把我那个的代码修改一下:
string pattern = @"(\d{2}){2,}|.+?(?=(\d{2}){2,}(?!\d))";
而楼主的测试用例明显考虑不周全string[] test = new string[] { "A1234", "A12345", "123A123456", "1A1234567", "12A12A2345", "A1234A12345", "12345A12345A12345", "12ABCE12A" };
Regex reg = new Regex(@"(\d{4}(?:\d{2})*)(?!\d(?:\d{2})*$)");
foreach (string src in test)
{
richTextBox2.Text += src.PadRight(18, ' ') + "-> ";
foreach (string s in reg.Split(src))
{
richTextBox2.Text += s + " ";
}
richTextBox2.Text += "\n";
}/*---------输出-----------
A1234 -> A 1234
A12345 -> A1 2345
123A123456 -> 123A 123456
1A1234567 -> 1A1 234567
12A12A2345 -> 12A12A 2345
A1234A12345 -> A 1234 A1 2345
12345A12345A12345 -> 1234 5A 1234 5A1 2345
12ABCE12A -> 12ABCE12A
*///如果要求输出结果是这样的
12345A12345A12345 -> 1234 5A1 2345 A1 2345
//则正则替换为
Regex reg = new Regex(@"^(\d{4}(?:\d{2})*)|(\d{4}(?:\d{2})*)(?!\d(?:\d{2})*(?:\D|$))");不过用Split还有一个问题,就是开头或结尾符合分割条件时,会各多出一个空项来,需要处理一下,这里没做判断