Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите с регулярным выражением в "крестиках-ноликах" (https://javascript.ru/forum/misc/81238-pomogite-s-regulyarnym-vyrazheniem-v-krestikakh-nolikakh.html)

jaroslav.tavgen 26.10.2020 17:25

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

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

Есть такое поле: "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. Как сделать так, чтобы второе выражение сработало?

jaroslav.tavgen 26.10.2020 17:57

С помощью рони в соседней теме понял, что при использовании "?<=" регулярное выражение, оказывается, читается справа налево, и поэтому нужно писать так:

alert("0X0\nX0*\n***".match(/(?<=(\1).{2}\n.{1}[X0].{1}\n.{2})\*/gi))


И где логика?

рони 26.10.2020 18:11

jaroslav.tavgen,
в данном случае лучше вычислять логически или по шаблону всех выигрышных комбинаций если их мало (тут всего 8), а не match.
https://javascript.ru/forum/misc/801...tml#post523960

jaroslav.tavgen 27.10.2020 11:39

Но... Я вообще не понял как это работает. Т.е. я вижу, что это работает, но вообще не понимаю КАК.

Каким образом данный код (ниже) понял, что "\1" - это именно [X0]? Я ведь даже его скобками не выделял. Почему не "." или "\n"?
alert("0X0\nX0*\n***".match(/(?<=(\1).{2}\n.{1}[X0].{1}\n.{2})\*/gi))

рони 27.10.2020 14:39

Цитата:

Сообщение от jaroslav.tavgen
Каким образом данный код (ниже) понял, что "\1" - это именно [X0]?

никаким, код \1 нашёл пустоту и пустоту продублировал, (\1) символы в коде как-бы есть, но по существу если их выкинуть, ничего не изменится.


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