Как можно повернуть регулярные кавычки (т.е.', ") в кавычки ЛАТЕКСА/TEX (т.е.'', '''')

Если файл состоит только из списка требуемых struct, сохраняемых непрерывно, то размер файла в байтах будет кратным размеру вашей структуры, и вы можете получить размер файла, а затем количество структур в файле примерно так:

size_t len_file, num_structs;

fseek(fp, 0, SEEK_END);
len_file = ftell(fp);
rewind(fp);

num_structs = len_file/sizeof(MYSTRUCT);
5
задан Brian M. Hunt 6 December 2008 в 18:23
поделиться

4 ответа

В целом эта проблема более трудна, чем это смотрит.

Самые простые случаи можно рассматривать с регулярными выражениями, но для более общих ситуаций необходимо будет почти наверняка создать рекурсивный синтаксический анализатор: регулярное выражение будет только работать, если не будет никакого вложения.

Большая проблема будет связанной с идентификацией единственного "'"s, которые не соединяются---, как сокращения ( "'" в "don't" не должен быть изменен и не должен быть соединен).


Позволяет видят, можем ли мы записать применимое описание EBNF:

input:       text+
text:        uquote|squote|dquote
squote       "'" text "'"
dquote       """ text """
uquote:      [contraction|.]+
contraction: [A-Za-z]+ "'" [A-Za-z]+

который ограничен сокращениями, которые имеют "'" посреди слова. Все связанное действие просто повторит вход, за исключением того, что squote и dquote условия заменяют кавычки в качестве соответствующих.


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

4
ответ дан 15 December 2019 в 01:13
поделиться

Вот некоторые замены регулярного выражения Perl, которые могли бы быть достаточно хорошими для того, что Вы хотите сделать.

s/"(\w)/``$1/g;
s/'(\w)/`$1/g;
s/([\w\.?!])"/$1''/g;

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

1
ответ дан 15 December 2019 в 01:13
поделиться

Спасибо за вход - полезный и ценивший.

Я также столкнулся с этим от Латекса CPAN:: Encode.pm:

    # A single or double quote before a word character, preceded
    # by start of line, whitespace or punctuation gets converted
    # to "`" or "``" respectively.

    $text =~ s{ ( ^ | [\s\p{IsPunct}] )( ['"] ) (?= \w ) }
              { $2 eq '"' ? "$1``" : "$1`" }mgxe;

    # A double quote preceded by a word or punctuation character
    # and followed by whitespace or end of line gets converted to
    # "''".  (Final single quotes are represented by themselves so
    # we don't need to worry about those.)

    $text =~ s{ (?<= [\w\p{IsPunct}] ) " (?= \s | $ ) }
              { "''" }mgxe
1
ответ дан 15 December 2019 в 01:13
поделиться

Не используйте регулярные выражения для этого вида задачи!

Возможно, можно ли получить некоторое вдохновение от SmartyPants?

0
ответ дан 15 December 2019 в 01:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: