Я пытаюсь гиперссылки 400 или около того ключевых слов в документе 50000 слов уценки.Perl regex без переменной длины lookbehind?
Это один из нескольких шагов в цепочке сборки «Perl», поэтому было бы идеально также для достижения гиперповерхности в Perl.
У меня есть отдельный файл содержит все ключевые слова, и отображения каждого фрагменту уценки, который он должен быть заменен, например:
keyword::(keyword)[#heading-to-jump-to]
Приведенный выше пример подразумевает, что там, где «ключевое слово» происходит в source markdown, его следует заменить фрагментом уценки «(ключевое слово)» [# heading-to-jump-to] ».
Игнорирование ключевых слов, которые являются подстроками других ключевых слов, множественных/сингулярных форм и неоднозначных ключевых слов, это достаточно просто. Но, естественно, есть еще два ограничения.
мне нужно соответствовать только примеры ключевых слов, которые являются:
- Не на линии не считаясь #
- Не наиболее непосредственно под заголовком, чтобы перейти к
Простой английский смысл из них: не соответствуют ключевым словам в любых заголовках и не заменяйте ключевые слова, которые находятся под заголовком, на который они ссылаются.
Мой скрипт Perl считывает пары $ keyword :: $ link, а затем пары по парам, заменяет их в регулярное выражение и затем ищет/заменяет документ этим регулярным выражением.
Я написал регулярное выражение, которое выполняет сопоставление (для случаев, которые я проверил вручную до сих пор) с использованием регулярного выражения Regex Buddy's JGSoft. Это выглядит следующим образом:
Frog::(Frog)[#the-frog)
-->
([Ff]rog'?s?'?)(?=[\.!\?,;: ])(?<!#+ [\w ]*[Ff]rogs?)(?<!#+ the-frog)(?<!#+ the-frog[^#]*)
Проблема (или, возможно, проблема) с этим его, что он использует переменную lookbacks длины, которые не поддерживаются Perl. Поэтому я не могу даже проверить это регулярное выражение на полном документе, чтобы увидеть, действительно ли это .
Я прочитал кучу других сообщений о том, как работать с обратными ссылками переменной длины, но я не могу понять, насколько это правильно для моего конкретного случая. Может ли какой-либо из постоянных мастеров регулярных выражений помочь с более быстрым регулярным выражением, которое будет выполняться в Perl?
Thanks amon, Три состояния, которые вы перечисляете, могут быть технически корректными, но состояние 2 не имеет значения в моем случае. Важно следующее: это ключевое слово не должно совпадать, если оно встречается в абзаце, прямо под заголовком, к которому должно быть привязано ключевое слово. Не обязательно, чтобы заголовок для ссылки содержал само ключевое слово (хотя это очень часто). Заголовки не обязательно должны быть отделены от следующих парасов пустыми строками (в основном это не так). – Tode
@Tode Я обновил свое сообщение, чтобы отразить, что ссылки, а не ключевые слова, запрещены. Я не расширил свой ответ, чтобы отключить заголовки из абзацев, потому что это не главная проблема в вашем вопросе (его можно решить, только распечатав только заголовок, и «повторить цикл с остальными», который распознается как параграф). – amon
Спасибо @amon. Я думаю, что я могу использовать адаптацию вашего решения, продолжая линию за строкой (потому что может быть несколько парам под заголовком) и только очистка «запрещенной» ссылки каждый раз, когда встречается новая строка заголовка. – Tode