У меня есть таблица стилей CSS, на которой я хочу провести некоторый анализ, и было неплохо использовать регулярные выражения в Notepad++. Теперь я обнаружил, что не могу написать регулярное выражение, и, может быть, это не была хорошая идея, но, плохая идея или нет, я хочу знать, как это сделать.

У меня есть автоматически сгенерированный набор стилей, помеченный (в основном) от block_1 до block_149. Сначала я хочу извлечь только информацию о настройках полей каждого стиля, поскольку это является одним из основных отличий. Некоторые из них правдоподобны, особенно ранние для заголовков и т.д., Но более поздние, по-видимому, отражают сложные вычисления исходного документа Word. Вы можете увидеть оба примера ниже:

[Примечание: я добавил 2 пробела в конце каждой строки, чтобы они правильно отображались здесь - эти пробелы не существуют в исходном коде. Однако исходный код (импортированный из Sigil) имеет дополнительный пробел в начале каждой строки - я не уверен, будет ли он получаться в виде пробелов или символа табуляции - я пытался использовать индикатор пробелов для все варианты.]

.block_8 {  
    background-color: #FFF;  
    display: block;  
    font-family: "Calibri", sans-serif;  
    font-size: 1.125em;  
    font-weight: bold;  
    line-height: 1.2;  
    page-break-after: avoid;  
    text-align: center;  
    padding: 0;  
    margin: 0 2.25pt 0 0  
    }  
.block_9 {  
    border-bottom: 0;  
    border-top: 0;  
    display: block;  
    line-height: 1.2;  
    text-indent: 1.5em;  
    padding: 0;  
    margin: 0.3em 0  
    }  
.block_10 {  
    background-color: #FFF;  
    border-bottom: 0;  
    border-top: 0;  
    display: block;  
    font-family: serif;  
    font-size: 0.75em;  
    line-height: 12.2pt;  
    text-indent: 1.5em;  
    padding: 0;  
    margin: 0.3em 0  
    }  
...   

.block_113 {  
    background-color: #FFF;  
    border-bottom: 0;  
    border-top: 0;  
    display: block;  
    letter-spacing: -0.1pt;  
    line-height: 1.2;  
    text-indent: 1.5em;  
    padding: 0;  
    margin: 0.3em 0 0.3em 16.1pt  
    }  
.block_114 {  
    background-color: #FFF;  
    border-bottom: 0;  
    border-top: 0;  
    display: block;  
    font-family: serif;  
    font-size: 0.75em;  
    text-indent: 1.5em;  
    padding: 0;  
    margin: 0.3em 0.5pt 0.3em 0.7pt  
    }  

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

То, что я хотел бы сделать, это иметь регулярное выражение, которое я мог бы использовать в первом случае, чтобы уменьшить каждую из этих записей только до: Block_(number) margin: (settings)

Я думал о том, чтобы извлечь различные настройки полей (T, R, B, L), но так как источник может включать в себя 1,2,3 или 4 параметра, сортировка этих правил с помощью регулярных выражений выходит за рамки моих амбиций. Я использовал regex101.com, чтобы попытаться уйти от очень простого распознавания, используя только настройки полей, но мне удалось включить все (переменное число) дополнительных строк между номером блока и настройками полей, что поставило меня в тупик. В идеале я хотел бы иметь возможность использовать подобную технику регулярных выражений для извлечения других настроек позже. Я также хотел бы иметь возможность справляться с переменным количеством пробелов и / или вкладок в макете.

Может кто-нибудь сказать мне, как это сделать? Дошло до того, что я почти наверняка смогу быстрее выполнять основные операции вырезания и вставки, но теперь я хочу знать, как сделать регулярное выражение в то время, когда оно может понадобиться для другого проекта.

EtA: у меня теперь есть код, который будет делать то, что я просил, и теперь хочу больше! Настройки, которые я хотел, оказались последними в блоке - предположим, что я хотел выбрать настройки высоты строки и изолировать их аналогичным способом - в качестве альтернативы настройкам полей?

1 ответ1

0

Ответ

Перейдите в диалоговое окно « Заменить » в Notepad++ (Ctrl+ h) или в меню « Search -> Replace... и выберите следующие параметры:

  • Режим поиска, установите переключатель « Регулярное выражение ».
  • Режим поиска, выберите " . Соответствует новой строке "

Используйте следующее для « Найти »:

(\.\w*)[[:blank:]]*\{.*?(margin:[\w[:blank:][:punct:]]*).*?\}

А для « Заменить на » используйте что-нибудь вроде этого (важны только $ 1 и $ 2):

$1 : $2

объяснение

Разбивая строку Find на ее компоненты слева направо, мы имеем:

  • (\.\w*) : Во-первых, нам нужно найти имя блока. Итак, начните с буквально "." (\.), за которым следуют буквенно-цифровые символы / символы подчеркивания (\w*). Помещение их в круглые скобки превращает их в группу, в данном случае в первую группу $1 .

  • [[:blank:]]*\{.*? : После имени блока может быть несколько пробелов ([[:blank:]]*), за которыми следует открывающаяся фигурная скобка (\{ - экранируется знаком «\», потому что скобки имеют специальное значение в регулярном выражении). Наконец, мы сопоставляем НИЧЕГО (.*), Включая новые строки, но как можно меньше (отсюда ?), Чтобы получить все внутри блока до следующей части (т. Е. "Поле"). Обратите внимание, что никакая часть этого не сгруппирована, потому что мы фактически отбрасываем это.

  • (margin:[\w[:blank:][:punct:]]*) : Следующая часть интереса - это поле и его значение. Следовательно, это сгруппировано и станет $2 . Сначала мы сопоставляем в буквальном смысле margin: затем его значение, которое будет представлять собой строку буквенно-цифровых символов / подчеркиваний, знаков препинания и пробелов (но не новую строку, например символы). Причина сложного [\w[:blank:][:punct:]]* в отличие от чего-то подобного .*? , Это . будет соответствовать любым символам, включая новые строки и все, что может существовать после строки поля, вплоть до закрывающей фигурной скобки.

  • .*?\} : Наконец, мы сопоставляем все, что осталось в блоке (в данном случае это просто новая строка в конце строки "margin") и закрывающая фигурная скобка. Снова, чтобы быть сброшенным.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .