Как работает эта простая тестовая функция?

#javascript #regex #primes

#javascript #регулярное выражение #простые числа

Вопрос:

Я видел этот простой тестовый код в другом сообществе программирования.

 isPrime=n=>!/^.$|^(.. )1 $/.test(Array(n 1));
  

Я могу понять RegExp, но я не мог понять, как это работает.

Почему пустой массив находится внутри теста регулярного выражения? и почему это работает???
Я искал его, но не смог найти никакой информации … 🙁

Комментарии:

1. Откуда вы взяли этот фрагмент?

2. @Sam Вопрос мог бы быть представлен лучше, но это не так уж и неясно, ИМО, это очень интересный алгоритм

3. @CertainPerformance не стесняйтесь ответить сейчас

4. Array(n 1) в этом контексте это то же самое, что ','.repeat(n) … итак, тест выполняется на n , символах … интересно…

Ответ №1:

Начнем с того, что регулярное выражение проходит проверку Array(n 1)) . Когда .test передается нестроковое значение, оно преобразуется в строку.

String(Array(5)) приводит к ,,,, (4 запятые). String(Array(3)) приводит к ,, (2 запятые) и так далее. (Все элементы массива соединяются через , , что приводит к length - 1 запятым).

Таким образом, isPrime(n) в результате регулярное выражение проверяется на соответствие строке, состоящей из n запятых.

Теперь самое интересное: регулярное выражение. Первая часть — это ^.$ тривиальный случай, когда входные данные равны 1. На самом деле это не имеет значения, поэтому не стесняйтесь игнорировать это.

Важная часть ^(.. )1 $ :

  • ^ — Начало строки
  • ( — Запуск группы
    • .. — Сопоставьте 2 или более символов
  • ) — Конец группы
  • 1 — Повторите группу, которая ранее была сопоставлена 1 или более раз
  • $ — Конец строки

На простом языке начальная группа захвата будет соответствовать 2 или более символам, а затем эта группа захвата будет повторена всего 2 или более раз, и полное совпадение будет охватывать всю длину строки.

Так, например, составное число 4 может быть сопоставлено путем ,, сопоставления в первой группе захвата и повторной ссылки на эту группу (сопоставления снова) еще раз.

Составное число 9 может быть сопоставлено, ,,, будучи сопоставленным в первой группе захвата, и с помощью повторной ссылки на эту группу еще дважды.

Простое число 5 не может быть сопоставлено, потому что в строке нет подсегментов, таких, что повторение подсегмента N раз (где N равно 2 или более) приведет к 5.

Таким образом, все регулярное выражение /^.$|^(.. )1 $/ будет выполнено для строки, если строка является составной. Инвертируйте этот тест, и вы получите проверку того, является ли число повторяющихся запятых простым.