Разделить строку с помощью 'в C # - PullRequest
0 голосов
/ 23 декабря 2011

Как разбить эту строку

1014,'0,1031,1032,1034,1035,1036',0,0,1,1,0,1,0,-1,1

и получить этот массив строк как результат

1014
'0,1031,1032,1034,1035,1036'
0
0
1
1
0
1
0
-1
1

в C #

Ответы [ 6 ]

5 голосов
/ 23 декабря 2011

Я считаю, что это регулярное выражение должно дать вам то, что вы ищете:

('(?:[^']|'')*'|[^',\r\n]*)(,|\r\n?|\n)?

http://regexr.com? 2vib4

РЕДАКТИРОВАНИЕ:

Быстрый фрагмент кода о том, как это может работать:

 var rx = new Regex("('(?:[^']|'')*'|[^',\r\n]*)(,|\r\n?|\n)?");
 var text= "1014,'0,1031,1032,1034,1035,1036',0,0,1,1,0,1,0,-1,1";

 var matches = rx.Matches(text);

 foreach (Match match in matches)
 {
     System.Console.WriteLine(match.Groups[1].ToString());
 }
1 голос
/ 23 декабря 2011

попробуйте это,

string line ="1014,'0,1031,1032,1034,1035,1036',0,0,1,1,0,1,0,-1,1" ;
var values = Regex.Matches(line, "(?:'(?<m>[^']*)')|(?<m>[^,]+)");
foreach (Match value in values) {
  Console.WriteLine(value.Groups["m"].Value);
}
1 голос
/ 23 декабря 2011

Этот код совсем не симпатичен, но работает. :) (Не работает с несколькими «строками» внутри строки.)

void Main()
{
    string stuff = "1014,'0,1031,1032,1034,1035,1036',0,0,1,1,0,1,0,-1,1";
    List<string> newStuff = new List<string>();

    var extract = stuff.Substring(stuff.IndexOf('\''), stuff.IndexOf('\'', stuff.IndexOf('\'') + 1) - stuff.IndexOf('\'') + 1);
    var oldExtract = extract;
    extract = extract.Replace(',',';');
    stuff = stuff.Replace(oldExtract, extract);
    newStuff.AddRange(stuff.Split(new[] {','}));
    var newList = newStuff;
    for(var i = 0; i < newList.Count; i++)
        newList[i] = newList[i].Replace(';',',');
    // And newList will be in the format you specified, but in a list..
}
0 голосов
/ 23 декабря 2011
using System;
using System.IO;
using Microsoft.VisualBasic.FileIO; //Microsoft.VisualBasic.dll

public class Sample {
    static void Main(){
        string data = "1014,'0,1031,1032,1034,1035,1036',0,0,1,1,0,1,0,-1,1";
        string[] fields = null;
        data = data.Replace('\'', '"');
        using(var csvReader = new TextFieldParser(new StringReader(data))){
            csvReader.SetDelimiters(new string[] {","});
            csvReader.HasFieldsEnclosedInQuotes = true;
            fields = csvReader.ReadFields();
        }
        foreach(var item in fields){
            Console.WriteLine("{0}",item);
        }
    }
}
0 голосов
/ 23 декабря 2011

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

var splits = input
            .Split('\'')
            .SelectMany(
                (s,i) => (i%2==0) 
                ? s.Split(new[]{','}, StringSplitOptions.RemoveEmptyEntries) 
                : new[]{ "'" + s + "'"}
            );

Это именно то, что описал @AVD + @Rawling ... Разделить на ', разделить только "четные" результаты, затем объединить.

0 голосов
/ 23 декабря 2011

Сначала разбейте строку на ' (одиночную) кавычку, а затем после выполните comma (,).

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