Во время работы со строкой я наткнулся на 2 строки, каждая из которых содержит 2 (в номерах) запятых ,.
using System;
using System.Text.RegularExpressions;
public class Program
{
public static void Main()
{
Regex rexCsvSplitter = new Regex(@",(?=(?:[^""]*""[^""]*"")*(?![^""]*""))");
string str1 = "\"\"|\"FAN100\"|\"\"|\"XXXXX XXXXX,XXX.\"|\"9999 XXXXXX,XXX XXXXX\"|\"\"|\"XXXXXXXXXXX\"|\"ON\"|\"X9X 9X9\"|\"XXX\"|\"99\"|\"XXX\"|\"999 999-9999\"|\"999 999-9999\"|\"XXXX XXXX\"|\"[email protected]\"|\"N\"|\"\"|\"0099\"|\"XXX\"|\"X\"|\"\"|\"\"";
string str2 = "\"\"|\"FAN100\"|\"\"|\"XXXXX XXXXX,XXX.\"|\"XX XXXX 9999,XXXXXX XXXXXX \"\"X\"\"|\"\"|\"XXXXXX\"|\"ON\"|\"XXX XXX\"|\"XXX\"|\"99\"|\"XXX\"|\"999 999-9999\"|\"999 999-9999\"|\"XXXX XXXX\"|\"[email protected]\"|\"N\"|\"\"|\"0099\"|\"XXX\"|\"X\"|\"\"|\"\"";
Console.WriteLine("Hello World: {0}, {1}",rexCsvSplitter.Split(str1).Length,rexCsvSplitter.Split(str2).Length);
}
}
В приведенном выше примере обе строки str1 и str2 состоят из 2 запятых, но с разными индексами. ,(?=(?:[^""]*""[^""]*"")*(?![^""]*"")) разделяет 'str1' с длиной 1 и str2 с длиной 3.
Почему это происходит, кто-нибудь может объяснить?
Заранее спасибо.
@ Джерри, я понимаю, просто управляю устаревшим кодом :)
Используйте парсер CSV, как сказал @Jerry
str2 имеет столбец с несбалансированными котировками "XX XXXX 9999,XXXXXX XXXXXX ""X"" В конце должна быть еще одна цитата. Регулярное выражение разбивается на запятые с четным количеством кавычек впереди. Из-за этого дисбаланса котировок в str2 разделение будет другим.
Я также нахожу странным, что этот код разбивается на запятые, хотя похоже, что он должен разбиваться на конвейеры (|)...
Похоже, вам нужно удалить двойные кавычки, а затем разделить символ пипса: string[] array = str1.Replace("\"","").Split(new char[] { '|' });
@ Джерри Ваше решение сработало. Спасибо !!





Вот почему люди должны использовать настоящие синтаксические анализаторы CSV вместо использования регулярных выражений для того же самого; это становится запутанным и трудным для отладки.