/ / Узгодження повторних підрядів у регулярному вираженні - регулярному вираженні

Узгодження на повторних підрядках в регулярному виразу - регулярні вирази

Чи можливий збіг регулярного виразу на основі інших частин того ж регулярного виразу?

Наприклад, як би я співставив рядки, які починаються і закінчуються однаковою послідовністю з 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)$/;

Для відповідності початку та кінця слід додати ^ і $ якорі.