Чи можливий збіг регулярного виразу на основі інших частин того ж регулярного виразу?
Наприклад, як би я співставив рядки, які починаються і закінчуються однаковою послідовністю з 3 символів, незалежно від того, що це символи?
Матчі:
abcabc
xyz abc xyz
Не збігаються:
abc123
Не визначено: (може відповідати чи ні, залежно від того, що легше)
ababa
a
В ідеалі, мені б хотілося чогось у ароматі пергельгексу. Якщо це неможливо, мені було б цікаво знати, чи є аромати, які може Зроби це.
Відповіді:
22 за відповідь № 1Використовуйте групи захоплення та зворотній зв'язок.
/^(.{3}).*1$/
The 1
Звертається до того, що відповідає вмісту першої групи захоплення (вмісту ()
). Режекси на більшості мов дозволяють щось подібне.
13 за відповідь № 2
Тобі потрібно зворотні посилання. Ідея полягає у використанні групи захоплення дляспочатку біт, а потім поверніться до нього, коли ви намагаєтеся зіставити останній біт. Ось приклад зіставлення пари HTML початкових і кінцевих тегів (за посиланням, поданим раніше):
<([A-Z][A-Z0-9]*)b[^>]*>.*?</1>
Цей регулярний вираз містить лише одну пару дужок, які захоплюють рядок, узгоджений з
[A-Z][A-Z0-9]*
в першу референцію. Це зворотне відновлення повторно використовується1
(зворотний нахил один). The/
перш ніж це просто похила черга в закритому тезі HTML, яку ми намагаємося зіставити.
Застосовуючи це до свого випадку:
/^(.{3}).*1$/
(Так, це "регулярний вираз", який розмістив Брайан Карпер. Існує просто не так багато способів зробити це.)
Детальне пояснення заради нащадків (будь ласка, не ображайтесь, якщо воно знаходиться під вами):
^
відповідає початку лінії.(.{3})
захоплює три символи будь-якого типу та зберігає їх у групі для подальшого ознайомлення..*
відповідає що завгодно довше. (Вам не байдуже, що знаходиться в середині рядка.)1
відповідає групі, яка була захоплена на кроці 2.$
відповідає кінці рядка.
3 для відповіді № 3
Для тих самих символів на початку та в кінці:
/^(.{3}).*1$/
1 для відповіді № 4
Це працює:
my $test = "abcabc";
print $test =~ m/^([a-z]{3}).*(1)$/;
Для відповідності початку та кінця слід додати ^
і $
якорі.