Найкоротший незмінний регулярний вираз


59

Ваша місія полягає в тому, щоб записати найкоротший правильний регулярний вираз, який не може відповідати жодна строка, включений порожній рядок.

Подання повинні мати таку форму ("буквальне позначення"):

/pattern/optional-flags

Найкоротший переможець виграє. Розмір регулярного вираження рахується в символах. (включаючи косої риси та прапорці)

Поясніть, будь ласка, як працює ваш regexp (якщо він не тривіальний)

Дякую і весело!


Це надихнуло мене питання. Я збираюся почекати кілька днів, хоча. Не хочу одночасно діяти два питання з регулярними
виразками

13
"Дійсно", відповідно до якої реалізації? Щойно я виявив кумедний той, з яким Perl все в порядку (і це дійсно відповідно до єдиної граматики RE, яку я можу знайти , але цей греп і повторний модуль Python відмовляються.
Josh Caswell,

1
Так, який діалект (-ів) виразів? Є багато багато різних.
hippietrail

1
А як щодо прізвищ президентів? xkcd.com/1313
Карл Віттофт

@CarlWitthoft Вам потрібно бути програмою, щоб взяти участь у цьому конкурсі: codegolf.stackexchange.com/q/17718/2180
кабінка

Відповіді:


53

6 символів

Слідом за відповідями прима та Пітера Тейлора, і натяк від man perlre:

/(?!)/

Цей сумісний з perl-регулярним виразом відповідає порожній рядку, за яким не йде інша порожня рядок.


+1 - Це, мабуть, найкоротша відповідь, яка є широко портативною (разом із цим /x\by/, але якщо мені колись довелося б використовувати такий регулярний вираз - з будь-якої причини - тоді ця відповідь також є найяснішою)
Мартін Ендер,

@ m.buettner: Дякую Примо, /(*FAIL)/мабуть, зрозуміліше. (І насправді man perlreвіддав це, згадуючи, що міна насправді поширюється на його внутрішнє.)
Нейт Елдредж

/(*FAIL)/Хоча це не так портативно. І навіть в Perl, я думаю, це більш незрозуміла риса, ніж негативна думка.
Мартін Ендер

3
Ви отримуєте орієнтування майже у всіх популярних (натхненні Perl) смаках сьогодні, тоді як я ніколи не бачив цих контрольних дієслів ніде, крім Perl.
Мартін Ендер

1
Насправді, документація Perl (і -Mre=debug) говорить про те, що (?!)оптимізовано оптимізатором (*FAIL)зворотного зразка Perl ( OPFAILзгідно -Mre=debug). Крім того, я не думаю, що я бачив (*FAIL)за межами Perl 5 (і Perl 6, де це називається <!>).
Конрад Боровський

39

8 символів

/(?=a)b/

Нам потрібна рядок, що містить символ, який є і те, aі b, що, очевидно, неможливо.


19
/(?!x)x/виглядає ще неможливіше ;-)
Говард

@PeterTaylor де?
o0 '.

@Lohoris, де що?
Пітер Тейлор

@PeterTaylor, куди він поставив ті абсурдні правила, про які ти говориш, я не зміг їх знайти.
o0 '.

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" після закінчення рядка.

або

/a^/

здійснює пошук a до початку рядка.


20
Навіщо ставити це питання, якщо ви знаєте, що існує двозначне рішення?
Пітер Тейлор

3
@Howard: Це відповідає порожній рядку: jsfiddle.net/RjLxJ
ProgramFOX

10
Чому я завжди знаходжу ці проблеми після того, як буде запропоновано неперевершене рішення :(
Cruncher

43
-1: Поміщення ^та $"незаконні" позиції просто спричиняють їх поводження як звичайних символів. Ваш перший приклад відповідає літералу $aв, sedймовірно, інших програмах.
Бен Джексон

2
@ Бен Джексон, це не вірно для POSIX ERE. Спробуйте echo 'a^b' | grep 'a^b'проти echo 'a^b' | grep -E 'a^b'. Ознайомтеся з 9.4.9 Ерекційний прив'язка до ERE
laindir

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}/. (Псавт. Хоча моя власна відповідь частково виглядає як ваша, я насправді прочитав вашу, написавши мою.)
nl-x

@ П-х вставте в консоль браузера: /[]/.test(""). він повертає помилкове. клас символів ніколи не може відповідати порожній рядку, навіть якщо він не містить символів (я думаю, вони реалізовані на зразок "ЯКЩО наступний символ у рядку є одним із перерахованих, збігайтеся; помилка ELSE"). /[]{0}/є законним (в ECMAScript) і відповідає порожній рядку ... однак, я не впевнений, наскільки це стосується моєї відповіді.
Мартін Ендер


@Nakilon, звичайно, так і є. Ruby не реалізує аромат ECMAScript.
Мартін Ендер

15

6 символів

/b++b/

Насильний квантор шукає стільки, скільки можливо, тоді ще 1. 6 символів, але очок за симетрію?


Ага ... Щойно я дізнався нову особливість. Мабуть, мої навички регексу погано застаріли. Дякую та +1.
Ільмарі Каронен

8

6 символів

/(\1)/

Не переможець, але я вважав, що це весело. grep і Python - це барф на цьому, але Perl здається, що з цим добре.

Здається, це дуже залежить від реалізації (що навряд чи дивно, враховуючи його дивацтво). Боб повідомляє нижче, що це відповідає будь-чому в механізмі регулярного вибору JavaScript.


Зрозуміло, двигун .ge .NET, здається, приймає це.
Боб

І це завжди збігається (порожній рядок) незалежно від того, який внесок у JS
Bob

8

Можливо, трохи обману, але ...

\0

… Є незмінним у регулярному виразі POSIX практично у всіх, якщо не у всіх реалізаціях. BASIC RE і EXTENDED RE, навіть.

І POSIX RE не потребує тих дотепних косої риски та прапорців, які має PCRE.


+1 Добре !! На жаль, підошва 0не працює в PERL. "0"=~0правда ...
Томаш

єдиний \0ITYM? Так, більшість реалізацій perlre (1) та PCRE не використовують рядки C, а обмежені розмірами буфери, у яких цей трюк не працюватиме, але більшість реалізацій POSIX RE працюють на C рядках.
mirabilos

5

5 символів

/^.^/

Збігається рядок, який починається з будь-якого одного символу перед початком рядка.


6
Також відповідає рядку".^"
стенд

@boothby: на якій мові збігаються? у Python ні. re.findall(r'^.^', '.^', re.DEBUG)
P̲̳x͓L̳

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

@boothby ^і .є метахарактеристиками не буквальними, яких потрібно
уникати

1
Це зламано в Perl. Це питання справді повинно було встановити деякі основні правила щодо мови.
кабінка

5

4 char:

/.^/

Працює з GNU grep 2.5.1 та egrep.


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

Навіщо вам це потрібно //? їх не потрібно скрізь ;-)
RSFalcon7

Обертаючі косої частини /рахуються, див. Оригінальне запитання ("у тому числі косої риски та прапорці") та запис програми " ОП" .
Олексій Попков

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

Ні, з тієї ж причини, що описана нижче: Насправді "^" є спеціальною лише тоді, коли на початку шаблону. Будь-яке «^» після нічого іншого не потрібно уникати, тому ця відповідь є неправильною.
mirabilos

4

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

/<!>/

Зловживання правилами Sorta (адже регекси Perl 6 різні та несумісні зі зоряними регексами за дизайном), але мені все одно. <!>правило повідомляє Perl 6, що регулярний вираз не відповідає.


4

6 байт

/(*F)/

Абревіатура для (*FAIL), підтримуваної perl-сумісними двигунами регулярного виведення. Дякуємо @HamZa за вказівку на це.

9 байт

/(*FAIL)/

Потрібно працювати з будь-яким движком регулярних виразів, який взагалі підтримує дієслова. Я не переконаний, що це дійсно потрібно займатись гольфом.


1
Як це працює?
виставка

@boothby (*FAIL)- дієслово, яке завжди провалюється.
примо

@primo ви можете просто скористатися /(*F)/:)
HamZa

4

4 символи

/$./

Потрібен будь-який символ після закінчення рядка


Як і у двох інших, $лише в кінці візерунка.
mirabilos

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

Це 5-ти символьний регекс.

/[]+/

Він відповідає порожній групі 1 або більше разів.

Редагувати:

Я відповів на інші смаки:

/.{-1}/

Все, що не є числом всередині {}, буде відповідати тексту.

Цей відповідатиме ". {- 1}"


Зауважте, що це працює лише у ароматі ECMAScript. У більшості (всіх?) Інших це не є дійсним виразом.
Мартін Ендер

Хіба це недійсне?
Васі

@Wasi не у відповідності зі стандартами ECMAScript
Мартін Ендер


-1
/$^/

Річ, яка закінчується ще до того, як вона почалася ...


7
Відповідає порожній рядок (у будь-якому випадку в реалізаціях RE).
Джош Касвелл

1
Ваша реалізація порушена :)
simon

2
Краще повідомте Гуйдо .
Джош Касвелл

7
Що ще більш важливо, так як Бен Джексон вказав , в Perl, де він не відповідає "", це дійсно відповідає рядку , що містить ці два буквених символів: "$^".
Джош Касвелл

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