Регулярные выражения не имеют состояния. Отслеживание того, находитесь ли вы внутри кавычек или нет, является информацией о состоянии. Поэтому невозможно правильно обработать это, используя только одно регулярное выражение. (Обратите внимание, что некоторые реализации «регулярных выражений» добавляют расширения, которые могут сделать это возможным; здесь я говорю исключительно об «истинных» регулярных выражениях.)
Выполнение этого с двумя регулярными выражениями возможно, однако, при условии, что вы готовы изменить исходную строку или работать с ее копией. В Perl:
$string =~ s/['"][^'"]*['"]//g;
my $match_count = $string =~ /:/g;
Первый найдет каждую последовательность, состоящую из кавычек, за которой следует любое количество символов, не заключенных в кавычки, и завершенную второй кавычкой, и удалит все такие последовательности из строки. Это исключит любые двоеточия, которые находятся в кавычках. (something:"firstValue":'secondValue'
становится something::
и something:'no:match'
становится something:
)
Второй выполняет простой подсчет оставшихся двоеточий, которые будут начинаться с кавычек.
Простой подсчет двоеточий без кавычек в большинстве случаев не кажется особенно полезным, поэтому я подозреваю, что вашей реальной целью является разбиение строки на поля с двоеточиями в качестве разделителя полей, в В этом случае это решение на основе регулярных выражений не подходит, так как оно уничтожит любые данные в полях в кавычках. В этом случае вам нужно использовать реальный парсер (большинство парсеров CSV позволяют указывать разделитель и идеально подходят для этого) или, в худшем случае, проходить строку за символом и разбивать ее вручную.
Если вы скажете нам язык, который используете, я уверен, что кто-то может предложить хорошую библиотеку синтаксического анализатора для этого языка.