Первое, что вы должны сделать, это избавиться от всех этих ненужных обратных слешей. Некоторые из них должны быть просто удалены; например, обратная косая черта в \""
просто игнорируется. Остальные обратные слеши теряют вес, но вам не нужно каждый раз их выписывать. Например, это будет соответствовать экранированным кавычкам и обратным слешам плюс escape-последовательности пробелов (к вашему сведению, вы оставили t
вне своего регулярного выражения):
@"\\[""\\/bfnrt]"
Я пропустил u
для выходов Unicode, потому что за ним должны следовать четыре шестнадцатеричные цифры; Вы должны сопоставлять их отдельно от других побегов. Добавление их к приведенному выше регулярному выражению дает вам
@"\\(?:[""\\/bfnrt]|u[0-9A-Fa-f]{4})"
Наконец, вы, похоже, используете [^(""|\\)]
для части catch-all, то есть любого символа Юникода, кроме кавычки, обратной косой черты или управляющего символа. На самом деле эта часть соответствует любому символу Юникода, кроме (
, "
, |
, )
или обратной косой черты. Правильный способ сопоставления чего-либо, кроме кавычки или обратной косой черты, будет [^""\\]
, но вам также необходимо исключить управляющие символы. Для этого вы можете использовать свойство Unicode, \p{Cc}
. Вот и все:
@"""(?:[^\p{Cc}""\\]+|\\(?:[""\\/bfnrt]|u[0-9A-Fa-f]{4}))*"""
Обратите внимание, что в это регулярное выражение я включил разделители кавычек, а не добавил их на отдельном шаге, как вы. Я предполагаю, что обратный слеш в \"
не должен рассматриваться как буквальный символ; в противном случае вы бы использовали два из них.