Есть несколько довольно крутых проблем, связанных с регулярным выражением ( Саморегулирующее регулярное выражение , регулярное выражение , проверяющее регулярное выражение )
Это вполне может быть невозможно, но есть ли регулярное выражение, которое будет соответствовать ТОЛЬКО самому себе?
ПРИМЕЧАНИЕ, разделители должны быть включены:
например /thing/
должен совпадать /thing/
а не thing
. Единственным возможным соответствием для вашего выражения должно быть само выражение. Многие языки допускают реализацию строки вместо регулярного выражения. Например в Go
package main
import "fmt"
import "regexp"
func main() {
var foo = regexp.MustCompile("bar")
fmt.Println(foo.MatchString("foobar"))
}
но ради задачи, пусть выражение будет разделено (начальный символ, выражение, конечный символ ex: /fancypantpattern/
или @[^2048]@
), если вы хотите аргументировать кавычки как разделитель, пусть будет так. Я думаю, учитывая очевидную сложность этой проблемы, это не будет иметь большого значения.
Чтобы помочь вам в этом:
Быстрый взлом, который я собрал для rubular.com (веб-страница для редактирования ruby regex):
var test = document.getElementById("test")
,regex = document.getElementById("regex")
,delimiter="/"
,options = document.getElementById("options")
,delay = function(){test.value = delimiter + regex.value + delimiter + options.value}
,update = function(e){
// without delay value = not updated value
window.setTimeout(delay,0);
}
regex.onkeydown = update;
options.onkeydown = update;
Хотя это технически «код-гольф», я буду очень впечатлен, если кто-нибудь сможет найти ответ / доказать, что это невозможно.
Ссылка теперь исправлена. Извините всех
Победный ответ пока: jimmy23013 с 40 символами
источник
aaa
но не / aaa ///
разделители или мы можем выбрать другие разделители (PCRE поддерживает практически любой символ, и, в частности, вы можете использовать соответствующие скобки / скобки / скобки в качестве разделителей)."/
и/"
Ответы:
PCRE аромат,
2612892101841271097153514440 байтДа, это возможно!
Попробуй это здесь. (Но
/
показано, что это разделитель на Regex101.)Пожалуйста, воздержитесь от внесения ненужных правок (обновлений) на странице Regex101. Если ваше редактирование на самом деле не предполагает улучшения, попытки или тестирования этого регулярного выражения, вы можете создать его или создать новые на их домашней странице .
Версия работает более корректно на Regex101 (44 байта):
Попробуй это здесь.
Это намного проще, чем оригинальная версия, и работает больше как традиционная квинна. Он пытается определить строку, не используя ее, и использовать ее в другом месте. Таким образом, его можно поместить очень близко к одному концу регулярного выражения, чтобы уменьшить количество символов, для которых требуется больше символов, чтобы определить соответствующий шаблон, и повторять их больше раз.
Пояснения:
\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
:Попробуй это здесь.
Оригинальная версия, 188 байт
Спасибо Мартину Бюттнеру за отыгрывание около 100 байтов!
Попробуй это здесь.
Или 210 байтов без
\Q...\E
:Попробуй это здесь.
Расширенная версия:
Расширения, подобныеОбратные ссылки не регулярны, но предвкушают.(?=
и\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\
.\2
. И вещи после группы 1 соответствуют 11 символам. Таким образом, общая длина двух времен\2
должна составлять ровно 3 символа. Знание\2
во второй раз длиной 3 символа, оно должно быть пустым в первый раз.\2
литералов в группе 1. С двумя\2
известными временами и последними несколькими символами, известными из первой строки, это регулярное выражение соответствует ровно одной строке.Regex без рекурсий и обратных ссылок, 85 байт
Кто-то может возразить, что выражения с рекурсиями или обратными ссылками не являются настоящими «регулярными» выражениями. Но выражения только с заглядыванием могут все еще соответствовать только обычным языкам, хотя они могут быть намного длиннее, если выражены традиционными регулярными выражениями.
Попробуй это здесь.
610 байтов без
\Q...\E
(для игры в гольф):Попробуй это здесь.
Идея похожа.
Основное регулярное выражение
Если предвидение не разрешено, лучшее, что я могу сейчас сделать, это:
который соответствует
Если
{m,n}
квантификатор не разрешен, это невозможно, потому что ничто, которое может соответствовать только одной строке, не может соответствовать строке длиннее самой себя. Конечно, можно по-прежнему придумывать что-то вроде того,\q
что только соответствует/\q/
, и при этом говорить выражения с этим регулярным. Но, очевидно, ничего подобного не поддерживается основными реализациями.источник