Кратчайшее непревзойденное регулярное выражение


59

Ваша миссия - написать кратчайшее правильное регулярное выражение, которому не может соответствовать ни одна строка, включая пустую строку.

Материалы должны иметь эту форму («буквенное обозначение»):

/pattern/optional-flags

Самое короткое регулярное выражение выигрывает. Размер регулярного выражения учитывается в символах. (включая косые черты и флаги)

Пожалуйста, объясните, как работает ваше регулярное выражение (если оно не тривиально)

Спасибо и веселитесь!


Это вдохновило меня на вопрос. Я собираюсь подождать несколько дней. Не хочу, чтобы 2 вопроса регулярных выражений были активными одновременно
Cruncher

13
«Действительный» в соответствии с какой реализацией? Я только что нашел забавную, с которой у Perl все в порядке (и она действительна в соответствии с единственной грамматикой RE, которую я могу найти , но этот модуль grep и re Python отказываются.
Josh Caswell

1
Да, какой диалект (ы) регулярных выражений? Есть много много разных.
hippietrail

1
Но как насчет имен президентов? xkcd.com/1313
Карл Виттофт

@CarlWitthoft Вы должны быть программой для участия в этом конкурсе: codegolf.stackexchange.com/q/17718/2180
boothby

Ответы:


53

6 символов

Далее следуют ответы Примо и Питера Тейлора, а также подсказка от man perlre:

/(?!)/

Это perl-совместимое регулярное выражение соответствует пустой строке, за которой не следует другая пустая строка.


+1 - Это, вероятно, самый короткий ответ, который широко переносим (вместе с тем /x\by/, но если бы мне когда-либо приходилось использовать такое регулярное выражение - по любой причине - тогда этот ответ также самый ясный)
Martin Ender

@ m.buettner: Спасибо. Примо, /(*FAIL)/наверное, понятнее. (И фактически man perlreотдал это, упомянув, что мое фактически расширяется до его внутреннего.)
Нейт Элдридж

/(*FAIL)/не такой портативный, хотя. И даже в Perl, я думаю, это более неясная особенность, чем негативная перспектива.
Мартин Эндер

3
Сегодня вы получаете обходные пути почти во всех популярных (вдохновленных Perl) вариантах, тогда как я никогда не видел этих глаголов управления нигде, кроме Perl.
Мартин Эндер

1
Фактически, документация Perl (и -Mre=debug) говорит, что (?!)оптимизирована в оптимизатор (*FAIL)Perl regex ( OPFAILсогласно -Mre=debug). Кроме того, я не думаю, что видел (*FAIL)за пределами Perl 5 (и Perl 6, где он называется <!>).
Конрад Боровски

39

8 символов

/(?=a)b/

Нам нужна строка, содержащая символ, который является одновременно aи b, что, очевидно, невозможно.


19
/(?!x)x/выглядит еще более невозможным ;-)
Howard

@PeterTaylor где?
о0 '.

@ Лохорис, где что?
Питер Тейлор

@PeterTaylor, куда он положил те абсурдные правила, о которых ты говоришь, я не смог их найти.
о0 '.

7
ребята, извините за подсчет, который я выбрал, я подумал, что будет проще включить косые черты из-за необязательных флагов, которые могут следовать за ними.
xem

31

5 символов

В отличие от всех, кто злоупотребляет $и ^... на самом деле это работает в Perl:

/V\A/

\A соответствует началу строки.


С этим ^тоже работает .
Томас


28

8 символов

/\w\b\w/

Граница слова ( \b), окруженная символами «слово» ( \w- один из [_a-zA-Z0-9]). Это невозможно сопоставить, так как один из символов, предшествующих или следующих за границей слова, должен быть символом, не являющимся словом.

Кстати: это похоже на непревзойденное выражение

/\W\b\W/

где \Wозначает не «слово» символ.


Это 8 символов в соответствии с правилами конкурса, потому что косые черты /засчитываются. См . Запись OP, например . Это отличная запись, хотя!
Джош Касвелл

Он также может быть победителем (или связан с записью Питера Тейлора ), учитывая зависящие от реализации проблемы с некоторыми из более коротких записей!
Джош Касвелл

Очень элегантный! Я думал, что должно быть что-то вроде этого!
Томас

22

4 символа

/$a/

ищет «а» после конца строки.

или же

/a^/

ищет перед началом строки.


20
Зачем отправлять вопрос, если вы знаете, что есть решение с двумя символами?
Питер Тейлор

3
@ Ховард: Это соответствует пустой строке: jsfiddle.net/RjLxJ
ProgramFOX

10
Почему я всегда нахожу эти проблемы после непревзойденного решения :(
Cruncher

43
-1: если поставить ^и $в «незаконные» позиции, они будут рассматриваться как обычные символы. Ваш первый пример соответствует буквально $aв sedи , возможно , другие программы.
Бен Джексон

2
@ Бен Джексон, это не так для PREIX ERE. Попробуйте echo 'a^b' | grep 'a^b'против echo 'a^b' | grep -E 'a^b'. Проверьте 9.4.9 ERE Expression
Anchoring

21

5 персонажей

/$.^/

/$^/ будет соответствовать пустой строке, тогда как наличие символа между ними не будет.


6
Это, к сожалению, соответствует "$a^"(или что-нибудь вместо 'a') в Perl ( и, возможно, sed ). Все еще хороший, хотя!
Джош Касвелл

@JoshCaswell: я думаю, Perl может интерпретировать $.как переменную текущего номера строки. Который может быть пустым, в этом случае это будет /^/.
MvG

Символ «между» просто означает односимвольную строку.
JWG

3
@jwg обратите внимание на обмен ^и$
mniip

Я попробовал шаблон '$^'с помощью grep, но, к сожалению, он соответствовал строке '$^'. Smartass grep.
Joeytwiddle

19

9 символов

Я не уверен, но /[^\S\s]/должен быть непревзойденным, поскольку это означает не любой персонаж, но по крайней мере один из них.


Вам не нужно +.
Питер Тейлор

10
/ [^ \ S \ s] / = 9 символов
xem,

19

6 персонажей

Я думаю, что это регулярное выражение, которое я сделал, будет работать:

/\b\B/

Он соответствует границе слова ( \b), которая не является границей слова ( \B). Что такое навязывание - я действительно должен тебе это объяснить?


не этот ли поиск границы слова, за которой следует граница без слова?
grexter89

1
@ grexter89 Да, но между ними не должно быть никаких символов. т.е. граница и не граница должны занимать одно и то же пространство.
Парень со шляпой

2
Мне нравится этот. Хороший улов.
Примо

18

4 персонажа

(Только вкус ECMAScript)

/[]/

В других вариантах это недопустимый класс символов ( ]он будет считаться символом в классе, поэтому выражение недопустимо, поскольку класс никогда не закрывается), но стандарт ECMAScript принимает пустые классы символов. Так как это класс, он должен соответствовать символу (так что пустые строки не совпадают), но так как ни один символ не включен, ни один фактический символ также не будет соответствовать.


Разве это не соответствует пустой строке, даже если вы говорите, что она должна соответствовать символу? Или ты считаешь это незаконным /[]{0}/. (Ps. Хотя мой собственный ответ частично похож на ваш, я на самом деле читаю ваш после написания моего.)
nl-x

@ NL-х вставьте в консоль браузера: /[]/.test(""). это возвращает ложь. класс символов никогда не может совпадать с пустой строкой, даже если он не содержит символов (я думаю, они реализованы как «ЕСЛИ следующий символ в строке является одним из перечисленных, соответствует; ELSE сбой»). /[]{0}/является допустимым (в ECMAScript) и соответствует пустой строке ... однако я не уверен, насколько это относится к моему ответу.
Мартин Эндер

Сбой в Ruby 2.0
Накилон

@Nakilon, конечно, это так. Ruby не реализует вкус ECMAScript.
Мартин Эндер

15

6 символов

/b++b/

Притяжательный квантификатор ищет как можно больше б, затем еще 1. 6 символов, но точки для симметрии?


Ха ... Я только что узнал новую функцию. Очевидно, мои навыки регулярных выражений сильно устарели. Спасибо и +1.
Ильмари Каронен

8

6 персонажей

/(\1)/

Не победитель, но я думал, что это было весело. grep и Python оба barf на этом, но Perl, кажется, согласен с этим.

Кажется, очень зависит от реализации (что неудивительно, учитывая его странность). Боб сообщает ниже, что это соответствует чему-либо в движке регулярных выражений JavaScript.


Движок регулярных выражений .NET, кажется, принимает это.
Боб

И оно всегда совпадает (пустая строка) независимо от того, что вводится в JS
Боб

8

Может быть, немного обманывают, но ...

\0

… Не имеет себе равных в регулярных выражениях POSIX практически во всех, если не во всех реализациях. BASIC RE и EXTENDED RE, даже.

И POSIX RE не нужны эти надоедливые косые черты и флаги, которые есть у PCRE.


+1 хорошо !! К сожалению, подошва 0не работает в PERL. "0"=~0это правда ...
Томас

единственный \0ITYM? Да, большинство реализаций perlre (1) и PCRE используют не строки C, а ограниченные по размеру буферы, в которых этот прием не будет работать, но большинство реализаций POSIX RE работают со строками C.
Мирабилось

5

5 символов

/^.^/

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


6
Также соответствует строка".^"
Boothby

@boothby: на каком языке совпадения? в Python нет. re.findall(r'^.^', '.^', re.DEBUG)
P̲̳x͓L̳

8
+1 за использование оператора манги (см. Stackoverflow.com/questions/3618340/… )
прототип

@boothby ^и .метасимволы не буквальные, которые нужно экранировать
P̲̳x͓L̳

1
Это сломано в Perl. Этот вопрос действительно должен был установить некоторые основные правила о языке.
Boothby

5

4 символа:

/.^/

Работает с GNU grep 2.5.1 и egrep.


/.^/= 4 символа
Алексей Попков

Зачем тебе это //? это не требуется везде ;-)
RSFalcon7

Количество косых /черт, см. Исходный вопрос («включая косые черты и флаги») и запись ОП .
Алексей Попков

правильно! Я скучаю по чтению :(
RSFalcon7

Нет, по той же причине, что и приведенная ниже: На самом деле «^» является особенным, только если он находится в начале шаблона. Любое «^» после чего-либо еще не должно быть экранировано, поэтому этот ответ неверен.
Мирабилось

4

Perl 6 (5 символов)

/<!>/

Злоупотребление правилами Сорта (потому что регулярные выражения Perl 6 отличаются и несовместимы с регулярными выражениями по стандарту), но мне все равно. <!>Правило сообщает Perl 6, что регулярное выражение не совпадает.


4

6 байт

/(*F)/

Аббревиатура для (*FAIL), поддерживаемая Perl-совместимыми движками регулярных выражений. Спасибо @HamZa за указание на это.

9 байт

/(*FAIL)/

Должен работать с любым движком регулярных выражений, который вообще поддерживает глаголы. Я не уверен, что это действительно нужно играть в гольф дальше.


1
Как это работает?
Boothby

@boothby (*FAIL)- глагол, который всегда терпит неудачу.
Примо

@primo, вы можете просто использовать /(*F)/:)
HamZa

4

4 символа

/$./

Нужен любой символ после окончания строки


Подобно двум другим, $это особенное только в конце шаблона.
Мирабилось

3

4 символа с косой чертой 2 без

В движке регулярных выражений языка TXR пустой класс []символов не соответствует ни одному символу и, следовательно, не содержит строку. Он ведет себя так, потому что класс символов требует совпадения символов, а когда он пуст, он указывает, что ни один символ не может его удовлетворить.

Другой способ состоит в инверсном «множество всех строк , включая пустые» регулярное выражение с /.*/помощью комплемента оператора: /~.*/. Дополнение к этому набору вообще не содержит строк и поэтому не может ничего совпадать.

Все это документировано на странице руководства:

   nomatch
          The  nomatch  regular  expression  represents  the empty set: it
          matches no strings at all, not even the empty string.  There  is
          no  dedicated  syntax  to  directly express nomatch in the regex
          language.  However, the empty character class []  is  equivalent
          to nomatch, and may be considered to be a notation for it. Other
          representations of nomatch are possible: for instance, the regex
          ~.* which is the complement of the regex that denotes the set of
          all possible strings, and thus denotes the empty set. A  nomatch
          has  uses;  for instance, it can be used to temporarily "comment
          out" regular expressions. The regex ([]abc|xyz) is equivalent to
          (xyz), since the []abc branch cannot match anything. Using [] to
          "block" a subexpression allows you to leave it  in  place,  then
          enable it later by removing the "block".

Косые черты не являются частью синтаксиса регулярных выражений как таковых; они просто пунктуация, которая ограничивает регулярные выражения в нотации S-выражения. Свидетель:

# match line of input with x variable, and then parse that as a regex
#
$ txr -c '@x
@(do (print (regex-parse x)) (put-char #\newline))' -
ab.*c                               <- input from tty: no slashes.
(compound #\a #\b (0+ wild) #\c)    <- output: AST of regex

спасибо за ваш ответ и еще раз извините за подсчет слеш. Я думал, что было бы легче включить их, если бы люди использовали флаги.
xem

1

6 символов

(или 4, в зависимости от того, как вы на это смотрите)

/{,0}/

Ошибка в Ruby 2.0
Накилон

В каких реализациях регулярных выражений это не дает ошибку?
Питер Тейлор

Я только протестировал его с помощью PHP preg_match.
Терси

1

Это регулярное выражение с 5 символами.

/[]+/

Это соответствует пустой группе 1 или более раз.

РЕДАКТИРОВАТЬ:

Удален мой ответ для других ароматов:

/.{-1}/

Все, что не является числом внутри {}, будет соответствовать тексту.

Этот будет соответствовать ". {- 1}"


Обратите внимание, что это работает только во вкусе ECMAScript. В большинстве (всех?) Других это недопустимое выражение.
Мартин Эндер

Разве это не недействительно?
Васи

@Wasi не в ECMAScript-совместимых вариантах
Мартин Эндер

0

5 персонажей

Надеюсь, это не звучит глупо: /[]+/


Нет. Не действительное регулярное выражение.
Парень со шляпой

@RyanCarlson Это законно и законно ... По крайней мере, в Ecmascript.
NL-X

-1
/$^/

То, что заканчивается прежде, чем началось ...


7
Соответствует пустой строке (в некоторых реализациях RE, в любом случае).
Джош Касвелл

1
Ваша реализация не работает :)
Simon

2
Лучше сообщите Гвидо .
Джош Касвелл

7
Что еще более важно, так как Бен Джексон указал , в Perl, где он не соответствует "", это действительно соответствует строке , содержащей эти два буквенных символов: "$^".
Джош Касвелл

+1 Я просто хотел опубликовать то же самое! @ Джош, он работает в PERL и не соответствует пустой строке! Комментарий Бена нарушен, я ответил на него.
Томас
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.