Просто добавьте .
к регулярному выражению
var patt1=/\.[0-9a-z]+$/i;
Поскольку точка - это специальный символ в регулярном выражении, вам нужно экранировать ее, чтобы буквально соответствовать ей: \.
.
Теперь ваш шаблон будет соответствовать любой строке, которая заканчивается точкой, за которой следует хотя бы один символ из [0-9a-z]
.
[
"foobar.a",
"foobar.txt",
"foobar.foobar1234"
].forEach( t =>
console.log(
t.match(/\.[0-9a-z]+$/i)[0]
)
)
, если вы хотите ограничить расширение также определенным количеством символов, чем вам нужно заменить, то +
var patt1=/\.[0-9a-z]{1,5}$/i;
позволят по крайней мере 1 и максимум 5 символов после точки.
Нет. Цитируя Уилла Дина из 85122
, вы не можете осмысленно «спать» (т.е. отказываться от запланированного CPU) в течение таких коротких периодов времени. Если вы хотите задержаться на какое-то короткое время, вам нужно вращаться, неоднократно проверяя таймер с подходящим высоким разрешением (например, «таймер производительности») и надеясь, что что-то с высоким приоритетом все равно вас не упустит.
Во-первых, точность сна неточна до миллисекунды. Я думаю, что это разрешение зависит от оборудования, и наименьшее время, в течение которого вы можете спать, обычно составляет около 20 мс. Это связано с тем, что Sleep фактически высвобождает то, что может остаться от кванта времени текущего потока; и позволяет запустить другой поток. Когда ваша цепочка снова сможет запускаться, после прохождения одного кванта времени планировщика потоков. Следовательно, разрешение составляет около 20 мс (при условии, что интервал времени в вашей системе составляет 20 мс).
Поскольку Windows не является ОС реального времени; Спящий режим и другие функции ожидания никогда не могут быть полностью детерминированными.
В зависимости от вашего приложения, вы могли бы большую часть времени выполнять спящий режим, а затем выполнять ожидание занятости, когда время имеет решающее значение. Или перепишите структуру так, чтобы вы точно измеряли прошедшее время (используйте System.Diagnostics.Stopwatch); но не зависят от возможности спать в течение определенного периода времени в миллисекундном диапазоне.
Первый ответ в этой ветке MSDN также очень хорошо объясняет это.
Спящий режим и другие функции ожидания никогда не могут быть полностью детерминированными.В зависимости от вашего приложения, вы могли бы большую часть времени выполнять спящий режим, а затем выполнять ожидание занятости, когда время имеет решающее значение. Или перепишите структуру так, чтобы вы точно измеряли прошедшее время (используйте System.Diagnostics.Stopwatch); но не зависят от возможности спать в течение определенного периода времени в миллисекундном диапазоне.
Первый ответ в этой ветке MSDN также очень хорошо объясняет это.
Спящий режим и другие функции ожидания никогда не могут быть полностью детерминированными.В зависимости от вашего приложения, вы могли бы большую часть времени выполнять спящий режим, а затем выполнять ожидание занятости, когда время имеет решающее значение. Или перепишите структуру так, чтобы вы точно измеряли прошедшее время (используйте System.Diagnostics.Stopwatch); но не зависят от возможности спать в течение определенного периода времени в миллисекундном диапазоне.
Первый ответ в этой ветке MSDN также очень хорошо объясняет это.
Наилучшая степень детализации, которую вы найдете для Thread.Sleep, - это использование класса TimeSpan. К сожалению, наименьшая степень детализации, которую он поддерживает, составляет миллисекунды. Невозможно заснуть в диапазоне микросекунд.
I had to write a music program where the notes had to start/stop at the correct duration, precisely, so I used the high-resolution timer in DirectX to do this, but, my application would also stay on top and hog the cpu, so it could keep checking for when to do the next action.
Since there is no way to know exactly when the OS will return control to your application, Thread.Sleep will be a very bad choice, and, as was mentioned, the smallest time increment can vary between 10 and 50ms, in my experience.