Вот одна возможность (у нее есть ахиллесова пята, к которой я доберусь):
(#[^"\n\r]*(?:"[^"\n\r]*"[^"\n\r]*)*[\r\n]|/\*([^*]|\*(?!/))*?\*/)(?=[^"]*(?:"[^"]*"[^"]*)*$)
В действии здесь
С флагами GLOBAL и DOTALL, но не флаг MULTILINE.
Объяснение регулярного выражения:
(
#[^"\n\r]* Hash mark followed by non-" and non-end-of-line
(?:"[^"\n\r]*"[^"\n\r]*)* If any quotes in the comment, they must be balanced
[\r\n] Followed by end-of-line ($ except we
don't have multiline flag)
| OR
/\*([^*]|\*(?!/))*?\*/ /* xxx */ sort of comment
) BOTH FOLLOWED BY
(?=[^"]*(?:"[^"]*"[^"]*)*$) only a *balanced* number of quotes for the
*rest of the code :O!*
Однако, это полагается на сбалансированные кавычки, используемые по всему тексту (он также не учитывает экранированные кавычки, но достаточно легко изменить регулярное выражение, чтобы учесть это).
Если у пользователя есть комментарий с «в нем, который не сбалансирован ... бум. Вы облажались!
Регулярное выражение обычно не рекомендуется, например, при разборе HTML / кода, но если вы можете полагаться на тот факт, что кавычки должны уравновешиваться при определении строки и т. Д., Иногда вы можете сойти с рук.
Поскольку вы также анализируете комментарии , у которых нет заданной структуры (т.е. вы не гарантированы, что кавычки в комментариях будут сбалансированы), вы не сможете найти решение регулярных выражений, которое работает здесь.
Все, что вы придумываете, может быть перехвачено неуравновешенной цитатой где-то в комментарии (скажем, комментарий был # remove all the " marks
) или многострочными строками (где на данной строке могут быть несбалансированные кавычки).
Итог - вы можете сделать регулярное выражение, которое будет работать в большинстве случаев, но не для всех. Чтобы получить что-то водонепроницаемое, вам нужно написать код.