Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.10.2020, 17:25
Кандидат Javascript-наук
Отправить личное сообщение для jaroslav.tavgen Посмотреть профиль Найти все сообщения от jaroslav.tavgen
 
Регистрация: 18.09.2014
Сообщений: 128

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

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

Есть такое поле: "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. Как сделать так, чтобы второе выражение сработало?
Ответить с цитированием
  #2 (permalink)  
Старый 26.10.2020, 17:57
Кандидат Javascript-наук
Отправить личное сообщение для jaroslav.tavgen Посмотреть профиль Найти все сообщения от jaroslav.tavgen
 
Регистрация: 18.09.2014
Сообщений: 128

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

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


И где логика?
Ответить с цитированием
  #3 (permalink)  
Старый 26.10.2020, 18:11
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

jaroslav.tavgen,
в данном случае лучше вычислять логически или по шаблону всех выигрышных комбинаций если их мало (тут всего 8), а не match.
https://javascript.ru/forum/misc/801...tml#post523960
Ответить с цитированием
  #4 (permalink)  
Старый 27.10.2020, 11:39
Кандидат Javascript-наук
Отправить личное сообщение для jaroslav.tavgen Посмотреть профиль Найти все сообщения от jaroslav.tavgen
 
Регистрация: 18.09.2014
Сообщений: 128

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

Каким образом данный код (ниже) понял, что "\1" - это именно [X0]? Я ведь даже его скобками не выделял. Почему не "." или "\n"?
alert("0X0\nX0*\n***".match(/(?<=(\1).{2}\n.{1}[X0].{1}\n.{2})\*/gi))
Ответить с цитированием
  #5 (permalink)  
Старый 27.10.2020, 14:39
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

Сообщение от jaroslav.tavgen
Каким образом данный код (ниже) понял, что "\1" - это именно [X0]?
никаким, код \1 нашёл пустоту и пустоту продублировал, (\1) символы в коде как-бы есть, но по существу если их выкинуть, ничего не изменится.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с регулярным выражением MC-XOBAHCK Общие вопросы Javascript 22 07.12.2018 05:19
Помогите с регулярным выражением Forgotten Общие вопросы Javascript 4 11.02.2014 16:38
помогите с регулярным выражением Axios Элементы интерфейса 3 13.01.2013 20:47
Помогите с регулярным выражением alerzo Элементы интерфейса 3 07.12.2012 15:59
помогите пожалуйста с регулярным выражением serhanters Общие вопросы Javascript 8 12.07.2011 19:17