2016-11-04 2 views
1

Мне нужно разбить этот код на ',' на C#.Разделить строку символом на C#

Пример строки:

'DC0''008 _', '23802,76', '23802,76', '23802,76', 'Comm, ERC,', '2f17', '3f44c0ba-daf1-44f0- a361- '

я могу использовать String.split (', '), но, как вы можете увидеть 'Comm, ERC,' разделен на

комм
ERC

также 'DC0''008_' должны разделиться, как

'DC0''008_'

не как

'DC0'

«008_ '

Ожидаемый результат должен быть таким:

'DC0''008_'

'23802,76'

'23802,76'

'23802,76'

«Comm, ERC , '

' 2f17 '

'3f44c0ba-daf1-44f0-a361-'

ответ

3

split может сделать это, но регулярное выражение будет более сложным.

Вы можете использовать Regex.Matches с помощью этого простого регулярного выражения:

'[^']*' 

и получить все строки в кавычках в коллекции.

Код:

MatchCollection matches = Regex.Matches(input, @"'[^']*'"); 

Чтобы напечатать все совпавшие значения:

foreach (Match match in Regex.Matches(input, @"'[^']*'")) 
     Console.WriteLine("Found {0}", match.Value); 

хранить все совпавшие значения в ArrayList:

ArrayList list = new ArrayList(); 
foreach (Match match in Regex.Matches(input, @"'[^']*'")) { 
    list.add(match.Value); 
} 

EDIT: Согласно комментариям ниже, если ОП хочет потреблять '' в зафиксированной строке затем использовать эту lookaround регулярное выражение:

'.*?(?<!')'(?!') 

(?<!')'(?!') означает соответствие апостроф, не окруженную другой одинарной кавычки.

RegEx Demo

+0

Как преобразовать в строку массива – RJV

+2

@VenkatRJV '' 'Regex.Matches (input, @" '[^'] * '"). Выберите (x => x.Value) .ToArray()' ' ' – Jules

+1

Спасибо @Jules, это очень полезно. – anubhava

2

Вы можете использовать Regex, чтобы получить все вещи внутри запятых и апострофов:

(?<=')[^,].*?(?=') 

Regex101 Explanation

Чтобы преобразовать его в массив строк, вы можете использовать следующие :

var matches = Regex.Matches(strInput, "(?<=')[^,].*?(?=')"); 
var array = matches.Cast<Match>().Select(x => x.Value).ToArray(); 

EDIT: Если вы хотите, чтобы это b В состоянии захватить двойные кавычки, тогда регулярное выражение, которое будет соответствовать ему в каждом случае, становится громоздким. На данный момент, это лучше всего использовать более простой шаблон с Regex.Split:

var matches = Regex.Split(strInput, "^'|'$|','") 
        .Where(x => !string.IsNullOrEmpty(x)) 
        .ToArray(); 
+0

Что делать, если он имеет двойную кавычку в примере строки' DC000''8_DC ',' 0002 'Ожидаемый вывод должен быть« DC000''8_DC »и« 0002 » – RJV

+0

@RJV See редактирование. – Abion47

0
using System; 
using System.Linq; 
using System.Text.RegularExpressions; 

namespace ConsoleApplication15 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string str = "'DC0008_','23802.76','23802.76','23802.76','Comm,erc,','2f17','3f44c0ba-daf1-44f0-a361-'"; 
      var matches = Regex.Matches(str, "(?<=')[^,].*?(?=')"); 
      var array = matches.Cast<Match>().Select(x => x.Value).ToArray(); 
      foreach (var item in array) 
      Console.WriteLine("'" + item + "'"); 
     } 
    } 
} 
+0

С двойной цитатой внутри, это не будет одна строка. – Harminder

+0

ваш код отличный, за исключением того, что он не включает одинарные кавычки после сплитрования –

0

это хорошо, чтобы изменить вашу строку затем разделить его так, что вы достигнете того, что вы хотите, как некоторые вещи ниже

string data = "'DC0008_','23802.76','23802.76','23802.76','Comm,erc,','2f17','3f44c0ba-daf1-44f0-a361-'"; 

data = Process(data); //process before split i.e for the time being replace outer comma with some thing else like '@' 

string[] result = data.Split('@'); // now it will work lolz not confirmed and tested 

процесс() функция ниже

private string Process(string input) 
{ 
    bool flag = false; 
    string temp=""; 
    char[] data = input.ToCharArray(); 
    foreach(char ch in data) 
    { 
    if(ch == '\'' || ch == '"') 
     if(flag) 
      flag=false; 
     else 
      flag=true; 

     if(ch == ',') 
     { 
      if(flag) //if it is inside ignore else replace with @ 
      temp+=ch; 
      else 
      temp+="@"; 
     } 
     else 
      temp+=ch; 
    } 
return temp; 
} 

см выход здесь http://rextester.com/COAH43918

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