Javascript.RU

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

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

Есть такое поле: "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:16.
Ответить с цитированием
  #2 (permalink)  
Старый 26.10.2020, 17:31
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 29,254

jaroslav.tavgen,
так как смотрим назад, то сначала копия и потом образец.
alert("aac".match(/(?<=\1(\w))\w/gi));
Ответить с цитированием
  #3 (permalink)  
Старый 26.10.2020, 17:36
Кандидат Javascript-наук
Отправить личное сообщение для jaroslav.tavgen Посмотреть профиль Найти все сообщения от jaroslav.tavgen
 
Регистрация: 18.09.2014
Сообщений: 106

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

alert("aaс".match(/(\w)\1/gi));
Ответить с цитированием
  #4 (permalink)  
Старый 26.10.2020, 17:39
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 29,254

Сообщение от jaroslav.tavgen
А как тогда такие конструкции работают, если смотрим назад?
alert("caa".match(/(\w)\1/gi));
Ответить с цитированием
  #5 (permalink)  
Старый 26.10.2020, 17:43
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 29,254

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

тоже самое что
alert("caa".match(/\w(?=(\w)\1)/gi));
Ответить с цитированием
  #6 (permalink)  
Старый 26.10.2020, 17:48
Кандидат Javascript-наук
Отправить личное сообщение для jaroslav.tavgen Посмотреть профиль Найти все сообщения от jaroslav.tavgen
 
Регистрация: 18.09.2014
Сообщений: 106

рони, где всем этим премудростям лучше всего учиться? А то чувствую, что в регулярных выражениях есть много не только того, чего я не знаю, но и того, что я не знаю, что я не знаю...
Ответить с цитированием
  #7 (permalink)  
Старый 26.10.2020, 18:01
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 29,254

Сообщение от jaroslav.tavgen
лучше всего учиться?
документация, опыт и console ...

"aac".replace(/(?<=\1(\w))\w/gi , (...a) => console.log(a));
"caa".replace(/\w(?=(\w)\1)/gi , (...a) => console.log(a));
Ответить с цитированием
  #8 (permalink)  
Старый 27.10.2020, 13:43
Кандидат Javascript-наук
Отправить личное сообщение для jaroslav.tavgen Посмотреть профиль Найти все сообщения от jaroslav.tavgen
 
Регистрация: 18.09.2014
Сообщений: 106

Сообщение от рони Посмотреть сообщение
jaroslav.tavgen,
так как смотрим назад, то сначала копия и потом образец.
alert("aac".match(/(?<=\1(\w))\w/gi));
Можете пояснить, как эта конструкция работает? Здесь написано, что backreference нельзя использовать в positive lookbehind. Судя по Вашему примеру, они брешут. Можете объяснить, как он работает? Что означает "\1" в нём?
Ответить с цитированием
  #9 (permalink)  
Старый 27.10.2020, 14:55
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 692

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

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

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



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно написать регулярное выражение, проверяющее, что введенное значение в in gsdev99 Элементы интерфейса 1 08.11.2019 14:34
Регулярное выражение (проценты) tai Общие вопросы Javascript 16 03.08.2018 08:07
Регулярное выражение zbara Общие вопросы Javascript 1 14.10.2016 20:11
Регулярное выражение alerzo Events/DOM/Window 1 17.09.2012 19:20
регулярное выражение leny Общие вопросы Javascript 1 24.09.2011 17:30