Регулярное выражение разбивает строку

#c# #regex #vba

#c# #регулярное выражение #vba

Вопрос:

Я нахожусь в тупике (будучи новичком в регулярных выражениях). Мне нужно разделить строку следующим образом

 "abc","","av,as","hello world","nice,name"
  

на

 'abc'
'blank'
'av,as'
'hello world'
'nice,name'
  

Используя c # или excel vbs, может кто-нибудь помочь с регулярным выражением?

Комментарии:

1. Похоже, вы пытаетесь использовать документ CSV. Я рекомендую использовать для этого библиотеку (см. secretgeek.net/csv_trouble.asp )

2. У вас проблема. «Я буду использовать регулярное выражение, чтобы решить это!» Теперь у вас есть две проблемы.

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

4. @JesseSeger: Я бы не стал, потому что что, если у него есть строка с экранированной кавычкой? "abc"123" приведет к сбою этой итерации. Я бы последовал совету фактора Мистика и использовал библиотеку синтаксического анализа CSV.

5. @Jesse даже если это домашнее задание, я не вижу в этом большой проблемы — весь смысл этого или почти ЛЮБОГО онлайн-форума в том, чтобы помочь кому-то получить ответ на проблему, с которой они сталкиваются — так это работает в реальной жизни, и школа ДОЛЖНА подготовить васдля реальной жизни, верно?

Ответ №1:

Довольно просто:

 "(\.|[^"\])*"
  

будет работать, как показано:

Список строк, заключенных в кавычки, разделенных запятыми

Это позволит экранировать кавычки и возможные пробелы между кавычками и совместимо с POSIX, если вам это когда-нибудь понадобится!

Редактировать

Я, вероятно, должен отметить, что в принципе НЕВОЗМОЖНО будет получить указанное 'blank' вами значение непосредственно из механизма регулярных выражений, но было бы относительно тривиально получить его из кода, который проверяет длину совпадения и заменяет его, если длина меньше трех символов (как совпадение будет "" , если была ошибка).пустая строка)

ЗАВЕРШЕНИЕ РЕДАКТИРОВАНИЯ

Пожалуйста, спросите, хотите ли вы, чтобы я разбил выражение!

Комментарии:

1. Идеальное решение. Работает очень хорошо. Спасибо.

Ответ №2:

Я думаю, вам следует использовать

 "(.*?)",?
  

регулярное выражение

Пример: http://regexr.com?2uvk8

Комментарии:

1. Не найдет экранированные кавычки и не будет игнорировать внутренние запятые.

2. В основном работает, но, как упоминал Джесси, не является полностью надежным. Но спасибо за ответ.

Ответ №3:

 (?:"((?:[a-z]) (?:[ ,a-z] ))")?("")? 
  

может использоваться

если группы 1 и 2 равны emtpy, вы сопоставили a , , если группа 1 имеет значение, вы сопоставили строку, а если группа 2 имеет значение, которое вы заключили в двойные кавычки emtpy ""

Но да, как уже было сказано, вы должны использовать синтаксический анализатор для скорости и точности…