PCRE аромат, 261 289 210 184 127 109 71 53 51 44 40 байт
Да, это возможно!
<^<()(?R){2}>\z|\1\Q^<()(?R){2}>\z|\1\Q>
Попробуй это здесь. (Но /
показано, что это разделитель на Regex101.)
Пожалуйста, воздержитесь от внесения ненужных правок (обновлений) на странице Regex101. Если ваше редактирование на самом деле не предполагает улучшения, попытки или тестирования этого регулярного выражения, вы можете создать его или создать новые на их домашней странице .
Версия работает более корректно на Regex101 (44 байта):
/^\/()(?R){2}\/\z|\1\Q^\/()(?R){2}\/\z|\1\Q/
Попробуй это здесь.
Это намного проще, чем оригинальная версия, и работает больше как традиционная квинна. Он пытается определить строку, не используя ее, и использовать ее в другом месте. Таким образом, его можно поместить очень близко к одному концу регулярного выражения, чтобы уменьшить количество символов, для которых требуется больше символов, чтобы определить соответствующий шаблон, и повторять их больше раз.
Пояснения:
\Q^\/()(?R){2}\/\z|\1\Q
соответствует строке ^\/()(?R){2}\/\z|\1\Q
. Это использует причуду, которую \Q...\E
не нужно закрывать, и работают неэкранированные разделители \Q
. Это заставило некоторые предыдущие версии работать только на Regex101, а не локально. Но, к счастью, последняя версия сработала, и я использовал для этого еще несколько байтов.
\1
до \Q
сопоставления с захваченной группой 1. Поскольку группа 1 не существует в этой опции, она может совпадать только в рекурсивных вызовах. В рекурсивных вызовах это соответствует пустым строкам.
(?R){2}
вызывает целое регулярное выражение дважды, что соответствует ^\/()(?R){2}\/\z|\1\Q
каждому разу.
()
ничего не делает, кроме как захватывает пустую строку в группу 1, которая включает другую опцию в рекурсивных вызовах.
^\/()(?R){2}\/\z
(?R){2}
добавлены совпадения с разделителями, от начала до конца. \/
До того , как рекурсивные вызовы также удостоверился сам этот вариант не соответствует в рекурсивных вызовах, так как он не будет в начале строки.
51 байт с закрытым \Q...\E
:
/\QE\1|^\/(\\)Q(?R){2}z\/\E\1|^\/(\\)Q(?R){2}z\/\z/
Попробуй это здесь.
Оригинальная версия, 188 байт
Спасибо Мартину Бюттнеру за отыгрывание около 100 байтов!
/^(?=.{173}\Q\2\)){2}.{11}$\E\/\z)((?=(.2.|))\2\/\2\^\2\(\2\?=\2\.\2\{173}\2\\Q\2\\2\2\\\2\)\2\)\2\{2}\2\.\2\{11}\2\$\2\\E\2\\\2\/\2\\z\2\)\2\(\2\(\2\?=\2\(\2\.2\2\.\2\|\2\)\2\)){2}.{11}$/
Попробуй это здесь.
Или 210 байтов без \Q...\E
:
/^(?=.{194}\\2\\.\)\{2}\.\{12}\$\/D$)((?=(.2.|))\2\/\2\^\2\(\2\?=\2\.\2\{194}\2\\\2\\2\2\\\2\\\2\.\2\\\2\)\2\\\2\{2}\2\\\2\.\2\\\2\{12}\2\\\2\$\2\\\2\/D\2\$\2\)\2\(\2\(\2\?=\2\(\2\.2\2\.\2\|\2\)\2\)){2}.{12}$/D
Попробуй это здесь.
Расширенная версия:
/^(?=.{173}\Q\2\)){2}.{11}$\E\/\z) # Match things near the end.
((?=(.2.|)) # Capture an empty string or \2\ into group 2.
\2\/\2\^\2\(\2\?=\2\.\2\{173}\2\\Q\2\\2\2\\\2\)\2\)\2\{2}\2\.
\2\{11}\2\$\2\\E\2\\\2\/\2\\z\2\) # 1st line escaped.
\2\(\2\(\2\?=\2\(\2\.2\2\.\2\|\2\)\2\) # 2nd line escaped.
){2}
.{11}$/x
Расширения, подобные (?=
и \1
делающие так называемые «регулярные» выражения, перестали быть регулярными, что также делает возможным использование кавычек. Обратные ссылки не регулярны, но предвкушают.
Объяснение:
- Я использую
\2\
вместо \
экранирования специальные символы. Если \2
соответствует пустой строке, \2\x
(где x
специальный символ) соответствует x
самому себе. Если \2
совпадает \2\
, \2\x
соответствует сбежавшему. \2
в двух матчах группы 1 могут отличаться в регулярных выражениях. В первый раз \2
должна совпадать пустая строка, а во второй раз \2\
.
\Q\2\)){2}.{11}$\E\/\z
(строка 1) соответствует 15 символам с конца. И .{11}$
(строка 7) соответствует 11 символам с конца (или перед завершающим переводом строки). Таким образом, шаблон непосредственно перед вторым шаблоном должен соответствовать первым 4 или 3 символам в первом шаблоне, поэтому \2\.\2\|\2\)\2\)
должен соответствовать ...\2\)
или ...\2\
. Не может быть завершающего символа новой строки, потому что последний символ должен быть )
. И сопоставляемый текст не содержит другого )
перед самым правым, поэтому все остальные символы должны быть в \2
. \2
определяется как (.2.|)
, так что это может быть только \2\
.
- В первой строке все выражение соответствует точно 188 символам, поскольку все имеет фиксированную длину. Два раза группы 1 соответствуют 45 * 2 символам плюс 29 раз
\2
. И вещи после группы 1 соответствуют 11 символам. Таким образом, общая длина двух времен \2
должна составлять ровно 3 символа. Знание \2
во второй раз длиной 3 символа, оно должно быть пустым в первый раз.
- Все, кроме заглядывания и
\2
литералов в группе 1. С двумя \2
известными временами и последними несколькими символами, известными из первой строки, это регулярное выражение соответствует ровно одной строке.
- Мартину Бюттнеру пришла в голову идея использовать lookahead для захвата группы 2 и наложения ее на часть quine. Это убрало символы, которые не были экранированы обычным образом между двумя временами группы 1, и помогло избежать шаблона, соответствующего им в моей исходной версии, и значительно упростило регулярное выражение.
Regex без рекурсий и обратных ссылок, 85 байт
Кто-то может возразить, что выражения с рекурсиями или обратными ссылками не являются настоящими «регулярными» выражениями. Но выражения только с заглядыванием могут все еще соответствовать только обычным языкам, хотя они могут быть намного длиннее, если выражены традиционными регулярными выражениями.
/(?=.*(\QE\\){2}z\/\z)^\/\(\?\=\.\*\(\\Q.{76}\E\\){2}z\/\z)^\/\(\?\=\.\*\(\\Q.{76}\z/
Попробуй это здесь.
610 байтов без \Q...\E
(для игры в гольф):
/^(?=.{610}$)(?=.{71}(\(\.\{8\}\)\?\\.[^(]*){57}\)\{2\}\.\{12\}\$\/D$)((.{8})?\/(.{8})?\^(.{8})?\((.{8})?\?=(.{8})?\.(.{8})?\{610(.{8})?\}(.{8})?\$(.{8})?\)(.{8})?\((.{8})?\?=(.{8})?\.(.{8})?\{71(.{8})?\}(.{8})?\((.{8})?\\(.{8})?\((.{8})?\\(.{8})?\.(.{8})?\\(.{8})?\{8(.{8})?\\(.{8})?\}(.{8})?\\(.{8})?\)(.{8})?\\(.{8})?\?(.{8})?\\(.{8})?\\(.{8})?\.(.{8})?\[(.{8})?\^(.{8})?\((.{8})?\](.{8})?\*(.{8})?\)(.{8})?\{57(.{8})?\}(.{8})?\\(.{8})?\)(.{8})?\\(.{8})?\{2(.{8})?\\(.{8})?\}(.{8})?\\(.{8})?\.(.{8})?\\(.{8})?\{12(.{8})?\\(.{8})?\}(.{8})?\\(.{8})?\$(.{8})?\\(.{8})?\/D(.{8})?\$(.{8})?\)(.{8})?\(){2}.{12}$/D
Попробуй это здесь.
Идея похожа.
/^(?=.{610}$)(?=.{71}(\(\.\{8\}\)\?\\.[^(]*){57}\)\{2\}\.\{12\}\$\/D$)
((.{8})?\/(.{8})?\^(.{8})?\((.{8})?\?=(.{8})?\.(.{8})?\{610(.{8})?\}(.{8})?\$(.{8})?\)
(.{8})?\((.{8})?\?=(.{8})?\.(.{8})?\{71(.{8})?\}
(.{8})?\((.{8})?\\(.{8})?\((.{8})?\\(.{8})?\.(.{8})?\\(.{8})?\{8(.{8})?\\(.{8})?\}
(.{8})?\\(.{8})?\)(.{8})?\\(.{8})?\?(.{8})?\\(.{8})?\\
(.{8})?\.(.{8})?\[(.{8})?\^(.{8})?\((.{8})?\](.{8})?\*(.{8})?\)(.{8})?\{57(.{8})?\}
(.{8})?\\(.{8})?\)(.{8})?\\(.{8})?\{2(.{8})?\\(.{8})?\}
(.{8})?\\(.{8})?\.(.{8})?\\(.{8})?\{12(.{8})?\\(.{8})?\}
(.{8})?\\(.{8})?\$(.{8})?\\(.{8})?\/D(.{8})?\$(.{8})?\)(.{8})?\(){2}.{12}$/D
Основное регулярное выражение
Если предвидение не разрешено, лучшее, что я могу сейчас сделать, это:
/\\(\\\(\\\\){2}/
который соответствует
\\(\\\(\\
Если {m,n}
квантификатор не разрешен, это невозможно, потому что ничто, которое может соответствовать только одной строке, не может соответствовать строке длиннее самой себя. Конечно, можно по-прежнему придумывать что-то вроде того, \q
что только соответствует /\q/
, и при этом говорить выражения с этим регулярным. Но, очевидно, ничего подобного не поддерживается основными реализациями.