Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Регулярное выражение "буква после повторяющейся буквы" (https://javascript.ru/forum/misc/81237-regulyarnoe-vyrazhenie-bukva-posle-povtoryayushhejjsya-bukvy.html)

jaroslav.tavgen 26.10.2020 16:50

Помогите с регулярным выражением в "крестиках-ноликах".
 
Пытаюсь поиграть в крестики-нолики с помощью регулярных выражений.

Есть такое поле: "0X0\nX0*\n***". Если его напечатать видно, что нолики готовятся выиграть по диагонали.

Я хочу найти поле (последняя звёздочка), которое идёт после двух крестиков, которые идут по диагонали. С помощью регулярного выражения.

Вот такое - работает:
alert("0X0\nX0*\n***".match(/(?<=0.{2}\n.{1}0.{1}\n.{2})\*/gi))

А такое - нет:
alert("0X0\nX0*\n***".match(/(?<=([X0]).{2}\n.{1}\1.{1}\n.{2})\*/gi))


Два вопроса:

1. Почему так?
2. Как сделать так, чтобы второе выражение сработало?

рони 26.10.2020 17:31

jaroslav.tavgen,
так как смотрим назад, то сначала копия и потом образец.
alert("aac".match(/(?<=\1(\w))\w/gi));

jaroslav.tavgen 26.10.2020 17:36

Цитата:

Сообщение от рони (Сообщение 530135)
jaroslav.tavgen,
так как смотрим назад, то сначала копия и потом образец.
alert("aac".match(/(?<=\1(\w))\w/gi));

А как тогда такие конструкции работают, если смотрим назад?

alert("aaс".match(/(\w)\1/gi));

рони 26.10.2020 17:39

Цитата:

Сообщение от jaroslav.tavgen
А как тогда такие конструкции работают, если смотрим назад?

alert("caa".match(/(\w)\1/gi));

рони 26.10.2020 17:43

jaroslav.tavgen,
alert("aac".match(/(?<=\1(\w))\w/gi))

тоже самое что
alert("caa".match(/\w(?=(\w)\1)/gi));

jaroslav.tavgen 26.10.2020 17:48

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

рони 26.10.2020 18:01

Цитата:

Сообщение от jaroslav.tavgen
лучше всего учиться?

:) документация, опыт и console ...

"aac".replace(/(?<=\1(\w))\w/gi , (...a) => console.log(a));
"caa".replace(/\w(?=(\w)\1)/gi , (...a) => console.log(a));

jaroslav.tavgen 27.10.2020 13:43

Цитата:

Сообщение от рони (Сообщение 530135)
jaroslav.tavgen,
так как смотрим назад, то сначала копия и потом образец.
alert("aac".match(/(?<=\1(\w))\w/gi));

Можете пояснить, как эта конструкция работает? Здесь написано, что backreference нельзя использовать в positive lookbehind. Судя по Вашему примеру, они брешут. Можете объяснить, как он работает? Что означает "\1" в нём?

voraa 27.10.2020 14:55

Цитата:

Сообщение от jaroslav.tavgen
Можете объяснить, как он работает? Что означает "\1" в нём?

\n - означает "тоже самое, что стоит в n-ых захватывающих скобках"

/(?<=\1(\w))\w/

Мы берем букву, которая стоит после
двух букв, но первая из этих двух букв, такая же как вторая


Часовой пояс GMT +3, время: 14:55.