2013-03-13 5 views
0

У меня есть строка, как [123,234,321, ....]Regular Expression разделить жалом

Могу ли я использовать регулярное выражение для извлечения только цифры?

это код, который я использую в настоящее время

public static string[] Split() 
    { 
     string s = "[123,234,345,456,567,678,789,890,100]"; 
     var temp = s.Replace("[", "").Replace("]", ""); 
     char[] separator = { ',' }; 
     return temp.Split(separator); 

    } 
+0

Что не так с кодом? –

+0

Да, вы можете. Тем не менее, я бы просто хотел сказать, что это именно то, как я его кодировал, ваше решение прекрасно, и я предпочел бы его подход RegExp –

ответ

2

Вы можете использовать string.Split для этого - нет необходимости в регулярном выражении, хотя ваш код может быть упрощена:

var nums = s.Split('[', ']', ','); 

Мысль вы, возможно, хотите исключить пустые записи в возвращаемом массиве:

var nums = s.Split(new[] { '[', ']', ',' }, 
        StringSplitOptions.RemoveEmptyEntries); 
+0

, хотя это может быть хорошим советом, его не то, что задал вопрос. –

+0

@ Keith - Я считаю, что, выходя за рамки фактического вопроса к фактическому требованию и как лучше всего его решить, я даю лучший ответ. – Oded

1

Есть перегрузка в Trim(), которая принимает символ.

Вы могли бы это сделать.

string s = "[123,234,345,456,567,678,789,890,100]"; 
var nums = s.Trim('[').Trim(']').Split(','); 
0

Попробуйте использовать string.Split метод;

string s = "[123,234,345,456,567,678,789,890,100]"; 
var numbers = s.Split('[',']', ','); 
foreach(var i in numbers) 
    Console.WriteLine(i); 

Адрес DEMO.

EDIT: Как Одедова mentioned, вы можете использовать StringSplitOptions.RemoveEmptyEntries также.

+0

@ Даунвотаторы не хотят комментировать хотя бы? –

1

Если вы хотите использовать регулярное выражение, попробуйте:

string s = "[123,234,345,456,567,678,789,890,100]";    
var matches = Regex.Matches(s, @"[0-9]+", RegexOptions.Compiled); 

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

0
string s = "[123,234,345,456,567,678,789,890,100]"; 
MatchCollection matches = Regex.Matches(s, @"(\d+)[,\]]"); 
string[] result = matches.OfType<Match>().Select(m => m.Groups[1].Value).ToArray(); 

Здесь @ используется для обозначения дословных строкового литерала и позволяет экранирующий символ «\», которые будут использоваться непосредственно в регулярном выражении нотации, не спасаясь себя «\».

\d - это цифра, \d+ означает 1 или более цифр. Скобки означают группу, поэтому (\d+) означает, что я хочу группу цифр. (* См группа использовала чуть позже)

[,\]] квадратные скобки, короче говоря, означает выбрать любой из моего элемента так будет выбрать либо запятая , или квадратные скобки ], которые я должен был бежать.

Таким образом, регулярное выражение найдет выражения последовательных цифр, а затем , или ]. Матчи возвращают набор совпадений (которые мы используем, потому что есть несколько наборов), тогда мы проходим через каждое соответствие - с некоторым LINQ - и захватываем группу индекса 1, которая является второй группой, «но мы сделали только одну группу?» Мы указали только одну группу, первая группа (индекс 0) - это полное соответствие регулярного выражения, которое в нашем случае будет содержать , или ], которые мы не хотим.

0

пока вы можете и, вероятно, должны использовать строку.Разделите, как указывают другие ответы, вопрос задает вопрос, можете ли вы сделать это с регулярным выражением, и да, вы можете: -

var r = new Regex(@"\d+", RegexOptions.Compiled); 
var matches = r.Matches("[123,234,345,456,567,678,789,890,100]"); 
+0

Обратите внимание, что в регулярных выражениях .NET '\ d' соответствует более чем' [0-9] '- он будет соответствовать любой нумерации Unicode (например, арабским цифрам). – Oded