#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:
Комментарии:
1. Не найдет экранированные кавычки и не будет игнорировать внутренние запятые.
2. В основном работает, но, как упоминал Джесси, не является полностью надежным. Но спасибо за ответ.
Ответ №3:
(?:"((?:[a-z]) (?:[ ,a-z] ))")?("")?
может использоваться
если группы 1 и 2 равны emtpy, вы сопоставили a ,
, если группа 1 имеет значение, вы сопоставили строку, а если группа 2 имеет значение, которое вы заключили в двойные кавычки emtpy ""
Но да, как уже было сказано, вы должны использовать синтаксический анализатор для скорости и точности…