C # файл gettext-string regex parser - PullRequest
       7

C # файл gettext-string regex parser

0 голосов
/ 01 декабря 2011

КРАТКИЙ ВОПРОС

Давайте получим регулярное выражение, которое читает строку внутри двойных кавычек.Эта строка действительна, только если внутри нее НЕТ двойных кавычек.

("([^"]+)")

Как написать регулярное выражение, которое будет иметь такую ​​же функциональность, но также будет работать для строки с двойными кавычками С предшествующей косой чертой?

"Valid string"      //VALID
"Valid \"string\""  //VALID
"Invalid " + "string"  //INVALID
"Invalid " + "\"string\""  //INVALID

ПОЛНЫЙ ВОПРОС

Я строю свою собственную реализацию gettext - я обнаружил, что официальные приложения gettext (http://www.gnu.org/s/gettext/)не достаточно для моих нужд.

Это означает, что мне нужно найти все строки внутри каждого файла кода C #, но только те, которые передаются определенной функции в качестве единственного параметра.

Я построилрегулярное выражение, которое получает большинство строк.Функция Translate является общедоступной, статической и находится в пространстве имен GetTextLocalization и в классе Localization.

(GetTextLocalization\.)?(Localization\.Translate)\("([^"]+)"\)

Конечно, это ТОЛЬКО найдет только строки и не найдет ни одной строки с дословноперсонаж.Если строковый параметр передается как операция («строка a» + «строка b») или начинается с дословно (@ «Строка ввода»), он не будет анализироваться, но это не проблема.

Определение регулярного выражения:

([^"]+)

говорит, что в строке не должно быть двойных кавычек, и я знаю, что никто в компании не подключает строку как-то при передаче ее в параметре.Тем не менее, мне нужно иметь эту конструкцию в качестве меры безопасности «что если».

Но это также вызывает проблему.Двойные кавычки на самом деле могут быть там.

Localization.Translate("Perfectly valid String with \"double quotes\"")

Мне нужно изменить регулярное выражение, чтобы оно включало строки с двойными кавычками (поэтому я пропускаю все что угодно, например Translate ("a")+ "b"), что могло бы испортить каталог перевода) , но только те, которым предшествует косая черта.

Я подумал, что мне может понадобиться как-то использовать эту (?!) конструкцию группировкино я понятия не имею, где его разместить.

1 Ответ

4 голосов
/ 01 декабря 2011

Поскольку вы, вероятно, хотите разрешить двойную обратную косую черту перед цитатой, я предлагаю

"(?:\\.|[^"\\])*"

Объяснение:

"        # Match "
(?:      # Either match
 \\.     # an escaped character
|        # or
 [^"\\]  # any character except " or \
)*       # any number of times.
"        # Match "

Это соответствует "hello", "hello\"there" или "hello\\", но не работает на "hello" there" или "hello\\" there".

...