Расщепление строки в C # - PullRequest
4 голосов
/ 10 марта 2011

Допустим, у меня есть эта строка:

"param1,r:1234,p:myparameters=1,2,3" 

... и я хотел бы разделить его на:

param1
r:1234
p:myparameters=1,2,3

Я использовал функцию разделения и, конечно, она разделяет ее на каждую запятую. Есть ли способ сделать это с помощью регулярных выражений, или мне придется написать свою собственную функцию разбиения?

Ответы [ 6 ]

2 голосов
/ 10 марта 2011

Вы можете использовать ; для разделения значений, что облегчает работу с ним.

Поскольку у вас есть , для разделения, а также для значений, его трудно разделить.

У вас есть

string str = "param1,r:1234,p:myparameters=1,2,3"

Рекомендуется использовать

string str = "param1;r:1234;p:myparameters=1,2,3"

, который можно разделить на

var strArray = str.Split(';');

strArray[0];  // contains param1
strArray[1];  // r:1234
strArray[2];  // p:myparameters=1,2,3
2 голосов
/ 10 марта 2011

Лично я бы попробовал что-то вроде этого:

,(?=[^,]+:.*?)

В основном, используйте положительный прогноз, чтобы найти запятую, за которой следует пара «ключ-значение» (это определяется ключом,двоеточие и дополнительная информация [данные] (включая другие запятые). Это также должно приводить к запятому между числами.

1 голос
/ 10 марта 2011

Самый простой подход - изменить разделитель с "," на что-то вроде "|".Затем вы можете разделить на "|"нет проблем.Однако, если вы не можете изменить символ-разделитель, возможно, вы могли бы закодировать разделы так же, как в CSV.

Файлы CSV имеют ту же проблему ... стандарт заключается в том, что двойные кавычки заключаются в "столбцы.

Например, ваша строка будет "param1", "r: 1234", "p: myparameters = 1,2,3".

Тогда вы можете использовать Microsoft.VisualBasic.FileIO.TextFieldParser для разделения / анализа.Вы можете включить это в c #, даже если оно находится в пространстве имен VisualBasic.

TextFieldParser

1 голос
/ 10 марта 2011

Это зависит.Вы не можете разобрать его с помощью регулярных выражений (или чего-либо еще), если не можете определить согласованное правило, отделяющее одну группу от другой.Исходя из вашего примера, я не могу четко определить такое правило (хотя у меня есть некоторые догадки).Как система узнает, что p:myparameters=1,2,3 это один элемент?Например, если после него был другой предмет, в чем разница между ним и 1,2,3?Поймите это, и вы будете очень близки к решению.

Если вы можете изменить формат входной строки, почему бы не выбрать согласованный разделитель между вашими группами?; будет хорошим выбором.Используйте входные данные, такие как param1;r:1234;p:myparameters=1,2,3, и не будет никакой двусмысленности, где группы, плюс вы можете просто разделить на ;, и вам не понадобится регулярное выражение.

1 голос
/ 10 марта 2011

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

Если это не фиксированное число каждый раз, в этом случае просто используйте перегрузка String.Split, которая принимает int, определяя, сколько подстрок вернуть при максимальном

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

0 голосов
/ 10 марта 2011

Вы имеете в виду следующее: string [] str = System.Text.RegularExpression.Regex.Spilt ("param1, r: 1234, p: myparameters = 1,2,3", @ "\,");

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...