2016-07-09 5 views
1

Как разбить строку ниже на строку с числами и операторами, разделенными (строка не содержит скобок или отрицательных чисел).regex для разбиения чисел и операторов

Пример:

inputString = 1+2-2.3*4/12.12 
outputList = {1,+,2,-,2.3,*,4,/,12.12} 

Ниже даст мне только цифры. Я не нужны операторы, а также

var digits = Regex.Split(inputString , @"\D+"); 
+0

Почему '2.3' разбирался как' 2.3', но '12.12' - как' 12, 12'? – soon

+0

Я решил, что это опечатка. – Kinetic

+0

Я удалил место из ввода, поскольку это не всегда так. также исправлена ​​опечатка 12.12 – Cannon

ответ

2

Поскольку вы подтверждаете, структура ввода довольно упрощенно - без скобок, никаких отрицательных чисел - вы можете просто использовать простой \s*([-+/*])\s* регулярное выражение для разбиения строки.

Обратите внимание, что Regex.Split также вывести все захваченные подстроки в результате:

Если захватывая круглые скобки используются в выражении Regex.Split, любой захваченный текст включается в результирующий массив строк.

Таким образом, использование

Regex.Split(input, @"\s*([-+/*])\s*") 
        .Where(n => !string.IsNullOrEmpty(n)) 
        .ToList(); 

Только не забудьте удалить пустые элементы из результирующего списка/массива. Подробнее

Pattern:

  • \s* - ноль или более пробельные символы (в "обрезать" элементы)
  • ([-+/*]) - Группа 1 захватывая -, +, / или *
  • \s* - ноль или более пробелов (для «обрезки» элементов)

Смотрите IDEONE demo:

var input = "1+2-2.3*4/12.12"; 
var results = Regex.Split(input, @"\s*([-+/*])\s*") 
       .Where(n => !string.IsNullOrEmpty(n)) 
       .ToList(); 
Console.WriteLine(string.Join("\n", results)); 
0

Вы можете использовать Regex.Matches вместо Regex.Split:

var test = "1 + 2 - 2.3 * 4/12.12"; 
foreach(Match match in Regex.Matches(test, @"\d+(,\d+)*(\.\d+(e\d+)?)|\d+|[\\+-\\*]")) 
    Console.WriteLine(match.Value); 
0

Это, казалось, работал для меня

/([\d\.]+)|([+-\/\*])+/g 

FYI - LINQPad является отличный инструмент для проверки Regex в C#