2016-06-08 2 views
2

Я пытаюсь написать расширенный regrex, который разделит мою строку в правильных местах.Расширенное регулярное выражение для разделения строк

Вы помните old phones (T9), где вы могли бы просто сделать 22022 написать «bb» Мне нужно что-то похожее.

Я получил расщепление на пробелах (которые реализуют паузу), но остальное действительно сложно.

Для пробельных это

var l = Regex.Split(a, @"\s"); 

, но мне нужно было следующее: 44204420442 should be 44, 2, 0, 44, 2, 0, 44, 2 поэтому было бы разделить также после того, как персонаж изменился по сравнению с предыдущим.

Спасибо заранее!

ответ

1

Вместо сложного регулярного выражения можно реализовать простой цикл:

public static IEnumerable<String> MySplit(String value) { 
    if (null == value) 
    throw new ArgumentNullException("value"); 

    char prior = '\0'; 

    StringBuilder sb = new StringBuilder(); 

    foreach (char current in value) { 
    if (sb.Length != 0 && prior != current) { 
     yield return sb.ToString(); 

     sb.Clear(); 
    } 

    if (!Char.IsWhiteSpace(current)) 
     sb.Append(current); 

    prior = current; 
    } 

    if (sb.Length > 0) 
    yield return sb.ToString(); 
} 

Тест:

string value = "44204420442"; 
string[] parts = MySplit(value).ToArray(); // if you want an array 

// 44, 2, 0, 44, 2, 0, 44, 2 
Console.Write(String.Join(", ", parts)); 

string value2 = "44 44 42"; 

// 44, 44, 4, 2 
Console.Write(String.Join(", ", MySplit(value2))); 
+0

Эй! Работает ли ваш код против 442 442 с пробелом? Как я могу изменить его для работы для этого –

+0

@Egert Aia: если вы хотите разбить на * белые пробелы *, вы должны добавить один 'if' (см. Мое редактирование) –

4

Вместо расщепления, это легче собрать все матчи:

Regex regexObj = new Regex(@"(\d)\1*"); 
allMatchResults = regexObj.Matches(subjectString); 

Вы должны посмотреть на каждый Match Объект .Groups[0].Value получает предмет.

Смежные вопросы