Регулярное выражение для N (от 1 до 3 цифр) чисел в квадратных скобках с запятыми + пробелы между ними
Я попытаюсь сформулировать это ясно... (я довольно новичок в регулярных выражениях). Я работаю над документом PDF с программой AutoBookmark (от Evermap). Я пытаюсь настроить его, чтобы связать пронумерованные ссылки с пронумерованными ссылками в библиографии.
Цель состоит в том, чтобы сопоставить каждую пронумерованную цитату в квадратных скобках и вернуть это число в квадратных скобках. Другими словами, если бы у меня было [85], я бы просто вернулся [85]. Если бы у меня было [85, 93], я бы вернул и [85], и [93]. Если в скобках больше цифр, вплоть до N цифр, я бы вернул N из них (в скобках). Если есть диапазон, то есть [85-93], мне нужно только вернуть первое.
Поэтому мне кажется, что я спрашиваю: номер (от 1 до 3 цифр), только если ему предшествует ЛИБО открывающая скобка, ИЛИ другое число, за которым следуют запятая и пробел, но только если этому номеру предшествует открывающее скобка ИЛИ число, за которым следуют запятая и пробел, но только если... вы получите картинку. Повторяйте, пока не найдете скобку (затем верните число) или не число, и в этом случае не возвращайте число. Это что-то даже разумное, чтобы спросить о регулярном выражении? Или, поскольку я делаю это в PDF, я должен сделать рутину Javascript? (кстати, я тоже не знаю, как это сделать!) Спасибо! Я знаю, что я новичок в этом, и я благодарен за любые мысли.
2 ответа
У меня нет опыта работы с этой программой, но она должна работать с javascript и другими минимально-функциональными реализациями Regex.
\[?\s*(\d+)\s*(?=(?:,\s*\d+)+|\])(?=[^\[]*\]).
\[? # Literal [, zero or 1 times
\s* # Any number (*) of whitespace characters
(\d+) # Any number of digits, one or more (+)
\s* # Any number (*) of whitespace characters
(?= # Positive lookahead, support for possitive lookahead is key to the regex
(?: # Open non-capturing group
,\s*\d+ # Literal ",", any number of whitespace characters,
# digits one or more
) # Close non-capturing group
| # or
\] # Literal "]"
) # Close positive lookahead
(?= # Open another positive lookahead
[^\[]*\] # Any number of characters that are not "[", as long as they're followed by "]".
# This is only a validation check, those characters won't be caught
) # Close positive lookahead
. # Match any character except newline
Если эта программа поддерживает указатели заданной длины, вы можете использовать ее, которая добавляет только указатель назад, чтобы убедиться, что число также имеет префикс правильных символов.
\[?\s*(?<=\[[,\d ]*)(\d+)\s*(?=(?:,\s*\d+)+|\])(?=[^\[]*\]).
Если ваш формат цитирования надежен на 100% [1]
, [12]
, [13, 14, 21]
и т. д. Вы можете использовать более простую версию
\[?\s*(\d+)(?=(?:, \d+)|\])(?=[^\[]*\]).
или это, если ваша программа поддерживает видоискатели переменной длины, \[(?<=\[[,\d ]*)(\d+)(?=(?:, \d+)|\])(?=[^\[]*\]).
,
С любым из этих выражений: вы можете изменить последний символ, .
, чтобы \]?
чтобы увидеть цитаты по-прежнему разделены запятыми [1],[15],[22]
,
*
Во многих разновидностях регулярных выражений lookbehinds - если поддерживается вообще, должен быть фиксированной длины без квантификаторов, а все чередования должны быть одинаковой ширины. Например, (?<=a|1)
будет работать но (?<=a|12)
, (<=a|1+)
или же (<=a+)
не удастся. Как будут применяться квантификаторы к самому взгляду (?<=a)+
Редактировать: И спасибо за Rawing за вклад.
Спасибо за предложения! Вот что происходит. Очевидно, Evermap не понимает обходные пути переменной длины, поэтому я попробовал другие. Они дают некоторые результаты, но не все. Они совпадают с простыми числами в скобках и соответствуют последнему числу в серии в скобках.
AutoBookmark предлагает "поиск по нескольким правилам" для поиска текстовых шаблонов, поэтому я мог бы искать [35] или [35 или, 35] или, 35, или 35- все по отдельности.
Прямо сейчас я использую три правила:
(\[)(\d{1,3})(\]|,)
\[?\s*(\d+)(?=(?:, \d+)|\])(?=[^\[]*\]).
(\[|\s)(\d{1,3})\-
Для каждого из них "заменить", или то, что программа называет "действием ссылки", является извлеченное число, или \2
,
Это дает мне большую часть того, что я хочу, но если в серии более двух чисел, разделенных запятой + пробел, это не соответствует средним числам. Полагаю, я бы сделал это вручную, если бы не смог найти лучшего способа.
Я знаю, что я спотыкаюсь здесь... Спасибо за помощь, и спасибо за терпение с новичком! (Если я решу это так, чтобы это было полностью автоматизировано, я буду богом на работе...)