Перекрестные регулярные выражения


21

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

Оба регулярных выражения должны иметь такую ​​форму:

/pattern/optional-flags

Это также форма, в которой они должны быть сопоставлены.

Самое короткое решение выигрывает. Длина решения считается как сумма символов в обоих регулярных выражениях, включая косые черты и флаги.

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

Повеселись!


Должно ли регулярное выражение также совпадать с косыми чертами и флагами другого регулярного выражения?
ProgramFOX

@ProgramFOX да, я добавил строку, чтобы прояснить ситуацию.
ПОЙТИ 0

Можете ли вы определить соответствие? т.е. делает регулярное выражение /a/матч abc?
Парень со шляпой

2
@TheGuywithTheHH Хорошо, я так думаю, если только вы не выберете язык, который накладывает определенные ограничения, такие как необходимость совпадать со всей строкой. Это решает вашу проблему?
ПОЙТИ 0

1
Для ясности: я предполагаю, что использование разных разделителей (как разрешено, например, PHP PCRE) не разрешено? (То есть не подавать /^%/и %^/%)
Питер Тейлор

Ответы:


7

PRCE с модификатором A: 9 символов

/A$/
/.A/A

Хотя это вариант /modifier$/ответа Doorknob , я думаю, что это нововведение квалифицирует его как отдельный ответ, а не как комментарий к нему: модификатор выполняет двойную функцию. Вместо того, чтобы быть там исключительно для другого регулярного выражения, он привязывает.

Первое регулярное выражение соответствует любой строке, заканчивающейся литералом A. Второе регулярное выражение соответствует любой строке, второй символ которой является литералом A, используя флаг привязки к началу.

Онлайн демо


3
Чтобы справиться с этим, требуется только четыре символа без разделителя, и, поскольку он //соответствует чему-либо, это означает, что каждый из регулярных выражений может иметь не более трех символов без разделителя. При использовании PHP PCRE существует 73339 несоответствующих регулярных выражений в этом ограничении, и возникает исчерпывающая проверка пар, длина которых меньше 10 (порядка 32Mpairs, а не 5.7Gpairs, поскольку большинство из них составляют 5 символов, включая разделители). это решение и никаких других. Поэтому я утверждаю, что это оптимально для этого конкретного движка регулярных выражений.
Питер Тейлор

18

4 + 6 = 10 баллов

Первое регулярное выражение:

/i$/

Второе регулярное выражение:

/^.i/i

Ура за злоупотребление флагом! :-П

Первый соответствует всему, что заканчивается i(следовательно, любому регулярному выражению с iфлагом).

Второй соответствует чему-либо со вторым символом i.

Альтернативная версия: /i$/gа /g$/i.


3
Еще одна вариация была бы /x.$/и /^.x/для кучки х
шиона

Или /i$/и/\/$/i
Питер Тейлор

Или /i$/и/i\$/i
Питер Тейлор

6

JavaScript регулярные выражения, оценка: 18

Первое регулярное выражение:

/^[^a]+$/

Второе регулярное выражение:

/^[^b]+$/

Тест JavaScript:

var regex1 = "/^[^a]+$/";
var regex2 = "/^[^b]+$/";
alert(/^[^a]+$/.test(regex2)); // true: regex1 matches regex2
alert(/^[^b]+$/.test(regex1)); // true: regex2 matches regex1
alert(/^[^a]+$/.test(regex1)); // false: regex1 doesn't match regex1
alert(/^[^b]+$/.test(regex2)); // false: regex2 doesn't match regex2

Тест онлайн: http://jsfiddle.net/99Sx6/


5

Ruby Regex, 15

Регулярные выражения:

/.{9}/
/^.{06}$/

Просто считать персонажей ...

Онлайн версия

r1 = '/.{9}/'
r2 = '/^.{06}$/'

p r1 =~ /^.{06}$/ #0:   r2 matches r1
p r2 =~ /.{9}/    #0:   r1 matches r2
p r1 =~ /.{9}/    #nil: r1 doesn't match r1
p r2 =~ /^.{06}$/ #nil: r2 doesn't match r2

5

4 + 6 = 10

Первое регулярное выражение:

/i$/

Второе регулярное выражение:

/\/$/i

i$соответствует чему-то, что заканчивается iвторым. /$соответствует чему-то, что заканчивается /первым.


2
Dupe из комментария я отправил на ответ Doorknob.
Питер Тейлор

@PeterTaylor Не замечал комментариев до сих пор. Это были независимые открытия.
Джастин

Да, я тоже самостоятельно обнаружил версию Шионы.
Питер Тейлор

3

5 + 5 = 10

Regex # 1:

/0.$/

Регулярное выражение № 2:

/^.0/

В 0s в обоих регулярных выражений может быть заменен любым не-метасимволом и регулярное выражение по- прежнему работает.

0.$соответствует любому, чей второй последний символ является 0, и ^.0соответствует любому, чей второй символ 0.


2
Первая пара не является допустимым регулярным выражением: вам нужно уйти от /es. Альтернатива - двойная оценка комментария к ответу Doorknob.
Питер Тейлор

2

JavaScript регулярные выражения, оценка: 13

Первое регулярное выражение:

/\d/

Второе регулярное выражение:

/^[^0]+$/

Объяснение: первое регулярное выражение соответствует всему, что содержит цифру, а второе регулярное выражение соответствует всему, что не содержит a 0.

Тест JavaScript:

var regex1 = "/\d/";
var regex2 = "/^[^0]+$/";
alert(/\d/.test(regex2)); // true: regex1 matches regex2
alert(/^[^0]+$/.test(regex1)); // true: regex2 matches regex1
alert(/\d/.test(regex1)); // false: regex1 doesn't match regex1
alert(/^[^0]+$/.test(regex2)); // false: regex2 doesn't math regex2

Тест онлайн: http://jsfiddle.net/5VYjC/1/



2

Оценка: 5 + 5 = 10

Мне потребовалось полчаса, чтобы понять, но я действительно счастлив, что сделал :)

1-й это: /j.$/

2-й это: /^.j/

1-й соответствует jсовпадению во второй позиции, начиная справа. 2-й соответствует jсобытию во второй позиции, начиная слева.

Я не проверял, но я думаю, что эти RegExs действительно универсальны, так как их jможно заменить любым \wсимволом (или больше?) И все равно должен работать нормально.

PS Это должно (надеюсь) работать на любом языке. Хотя, если это не работает в любом, пожалуйста, сообщите в комментариях ниже :)

Тестовое задание


И теперь я понял, что @Quiccunx уже опубликовал ту же версию, что и моя. Мне очень жаль Quiccunx, и если это будет угодно, я удалю свой ответ.
Гауранг Тандон

1

PCRE с использованием модификатора x: 11 символов

/\s/
/ s.$/x

Первая соответствует любой строке с пробелом, но не содержит пробелов. Второй содержит пробелы, но он игнорируется из-за xмодификатора; это соответствует любой строке, чей предпоследний символ s.

PCRE и другие движки, использующие классы персонажей: 11 символов

/\w+w/
/\Ww/

Первая соответствует любой строке с символом «слово» (буква, цифра, подчеркивание), за которым следует литерал w; вторая соответствует любой строке с несловесным символом, за которым следует литерал w.

PCRE и другие движки, использующие классы символов и привязку границ слов: 11 символов

/\w\w/
/\bw/

Первый соответствует любой строке с двумя последовательными символами «слова»; вторая любая строка с несловесным символом или началом строки, за которой следует литерал w.


-1

ECMAScript (11 байт):

/^\1?d/
/\d/

Другие двигатели REGEXP (14 байтов):

/^\\\\1?d/
/\d/

Первый соответствует \ d [..] или \ 1d [..].

Вторая соответствует любой строке с номером.

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

Первоначально этот ответ был опубликован как совместимый со всеми двигателями, но оказалось, что он ошибочен.

Возникла проблема со ссылками на группы захвата (например, в php).


Многие движки регулярных выражений принимают регулярные выражения без окружающих слэшей, но вопрос совершенно ясен, требуя их подсчета.
Питер Тейлор

Я не считаю это ответом. Позвольте мне добавить примечание для этого.
Исмаэль Мигель

1
@PeterTaylor Я добавил примечание. Версия Apache существует только потому, что.
Исмаэль Мигель

Держись: в каких движках первый парсинг \1не интерпретируется как обратная ссылка?
Питер Тейлор

В зависимости от того, как вы его используете. В php, например, если вы положите внутрь, у "/^\1?d/"вас будут проблемы, но если вы это сделаете '/^\1?d/', то это нормально. Кавычки имеют огромное значение, когда код интерпретируется.
Исмаэль Мигель
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.