Перехресне узгодження регулярних виразів


21

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

Обидва регулярні вирази повинні мати таку форму:

/pattern/optional-flags

Це також форма, в якій вони повинні відповідати.

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

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

Веселіться!


Чи повинен регулярний вираз відповідати косою рисою та прапорами іншого регексу?
ProgramFOX

@ProgramFOX так, я додав рядок, щоб зробити його зрозумілим.
ГОТО 0

Чи можете ви визначити відповідність? тобто /a/збігається регулярний вираз abc?
Хлопець з капелюхом

2
@TheGuywithTheHat добре, я думаю, що так, якщо ви не обрали мову, яка накладає певні обмеження, як, наприклад, необхідність узгодження всього рядка. Чи вирішує це ваше питання?
ГОТО 0

1
Щоб було зрозуміло: я припускаю, що використання різних роздільників (як це дозволено, наприклад, PHP PCRE) не дозволяється? (Тобто не подаючи /^%/і %^/%)
Пітер Тейлор

Відповіді:


7

PRCE з модифікатором A: 9 знаків

/A$/
/.A/A

Хоча це варіант відповіді Дорнобба /modifier$/, я думаю, що це нововведення кваліфікує це як окрему відповідь, а не коментар до його: модифікатор виконує подвійний обов'язок. Замість того, щоб бути там виключно для того, щоб відповідати інший регулярний вираз, він закріплює.

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

Демонстрація в Інтернеті


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

18

4 + 6 = оцінка 10

Перший вираз:

/i$/

Другий вираз:

/^.i/i

Ура за зловживання прапором! :-P

Перший відповідає тому, що закінчується i(тому будь-який регулярний вираз із iпрапором).

Другий відповідає чому-небудь другому символу i.

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


3
Ще одна варіація була б /x.$/і /^.x/для купки x
shiona

Або /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

Регекс Рубі, 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
У коментарі я опублікував відповідь Дорноба.
Пітер Тейлор

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

Так, і я самостійно відкрив версію shiona.
Пітер Тейлор

3

5 + 5 = 10

Регекс №1:

/0.$/

Регекс №2:

/^.0/

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

0.$відповідає будь-якому, другий останній персонаж 0, і ^.0відповідає будь-якому, другий символ якого є 0.


2
Перша пара не є дійсними регулярними виразами: вам потрібно уникнути /es. Альтернатива - це коментар щодо відповіді Дорноба.
Пітер Тейлор

2

Реджекси JavaScript, оцінка: 13

Перший вираз:

/\d/

Другий вираз:

/^[^0]+$/

Пояснення: перший регекс відповідає усьому, що містить цифру, а другий регулярний вираз відповідає всім, що не містить 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відбувається на другій позиції, починаючи зліва.

Я не пройшов тестування, але думаю, що ці RegEx дійсно універсальні, оскільки їх jможна замінити будь-яким \wсимволом (або більше?) І все одно має працювати нормально.

PS Це повинно (сподіваємось) працювати будь-якою мовою. Хоча, якщо це не працює ні в якому разі, повідомте про це в коментарях нижче :)

Тест


І я зараз розумію, що @Quiccunx вже опублікував ту саму версію, що і моя. Мені дуже шкода Quiccunx, і якщо це сподобається, я видалю свою відповідь.
Gaurang Tandon

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/

1-й збіг \ d [..] або \ 1d [..].

Другий відповідає будь-якому рядку з числом.

Редагувати:

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

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


Багато регекс-двигунів беруть регулярний вираз без навколишніх косої риси, але питання досить чітке в тому, щоб вимагати їх врахування.
Пітер Тейлор

Я не вважаю це як відповідь. Дозвольте додати до цього записку.
Ісмаїл Мігель

1
@PeterTaylor Я додав замітку. Версія Apache існує тільки тому.
Ісмаїл Мігель

Почекайте: у яких двигунах перший синтаксичний аналіз \1не інтерпретується як зворотний посилання?
Пітер Тейлор

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