#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 $/
будет выполнено для строки, если строка является составной. Инвертируйте этот тест, и вы получите проверку того, является ли число повторяющихся запятых простым.