Вы должны использовать номер один, потому что номер два - плохая практика. Учтите, что разработчик, который идет за вами, хочет сопоставить строки, за которыми следует восклицательный знак. Должен ли он использовать:
"[^"]*"!
или
".*?"!
Разница появляется, когда у вас есть предмет:
"one" "two"!
Первое совпадение с регулярным выражением:
"two"!
при совпадении второго регулярного выражения:
"one" "two"!
Всегда будьте как можно точнее. По возможности используйте отрицательный класс символов.
Другое отличие состоит в том, что [^ "] * может проходить через строки, в то время как. * Нет, если вы не используете однострочный режим. [^" \ N] * исключает также разрывы строк.
Что касается обратного отслеживания, то второе регулярное выражение возвращает обратно для каждого символа в каждой строке, которой он соответствует. Если закрывающая кавычка отсутствует, оба регулярных выражения будут возвращаться по всему файлу. Различается только порядок, в котором затем происходит возврат. Таким образом, в теории, первое регулярное выражение быстрее. На практике вы не заметите разницу.