Проверка с использованием регулярных выражений в приложении C#.net
Мы хотим проверить входные записи файла.DAT для предоставленных разделителей.
В нашем приложении.net мы можем проанализировать входной файл в соответствии с предоставленным разделителем, где все разделители являются правильными, например: "Тест", "Данные","CaseInforation"
вышеупомянутая запись / строка из файла будет успешно проанализирована, теперь у нас есть проблема с строкой / записью, отформатированной как показано ниже:
"Test", data, "CaseInforation" (вы можете видеть, что нет текстового спецификатора, окруженного значением "data", и из-за этого возникает проблема при разборе данных из файла).
Поэтому мы решили использовать регулярное выражение для поиска проблемного значения, которое не окружено TextQualifier.
Чтобы решить эту проблему, мы создали ниже RegEx, чтобы найти проблемное значение, \x2C([^\x22].*?[^\ X22])\x2C
используя приведенное выше регулярное выражение, оно работает в записях между первым и последним полями.
"Test", data, "CaseInforation" -> Регулярное выражение успешно анализирует эти записи и предоставляет данные в виде выходного поля, имеющего проблему.
"Test", "data", CaseInforation -> для этой записи регулярное выражение не соответствует последнему значению.
Может ли кто-нибудь помочь нам исправить регулярное выражение, которое будет соответствовать первому или последнему значению.
Благодарю.
3 ответа
^(?:(?:"((?:""|[^"])+)"|([^,]*))(?:$|,))+$
Будет соответствовать всей строке, тогда вы можете использовать match.Groups[1].Captures, чтобы получить ваши данные (без кавычек). Кроме того, я позволю "My name is ""in quotes"""
быть действительной строкой.
string mystring = "\"Test\",\"data\",\"CaseInforation\"";
MatchCollection matches = Regex.Matches(mystring, "^(?:(?:\"((?:\"\"|[^\"])+)\"|([^,]*))(?:$|,))+$");
match[0].Value = "Test","data","CaseInforation"
match[0].Groups[0].Value => "Test","data","CaseInforation"
match[0].Groups[0].Captures[0].Value => "Test","data","CaseInforation"
match[0].Groups[1].Value => CaseInforation
match[0].Groups[1].Captures[0].Value => Test
match[0].Groups[1].Captures[1].Value => data
match[0].Groups[1].Captures[2].Value => CaseInforation
Просто [^\",]+
должен давать вам одно совпадение для каждого значения, пока любые значения "и" находятся между значениями. И если они есть внутри значения, это значение будет просто разделено на два.
так как то так:
foreach(Match match in Regex.Matches(data, "[^\",]+"))
{
Console.WriteLine(match.Value);//or whatever
}
Хотя, если у вас есть "Test",data,"CaseIn"foration"
вы бы получили Test, data, CaseIn и fration out.