Я думаю, что вы хотите использовать разные регулярные выражения для разных надежных паролей. Большинство движков регулярных выражений имеют функцию под названием «lookarounds». Это в основном утверждения. Я приведу вам пример, использующий косвенные утверждения.
var isEightCharactersLong = '(?=.{8,})';
var hasNumbers = '(?=.*[0-9])';
var hasLowerCase = '(?=.*[a-z])';
var hasUpperCase = '(?=.*[A-Z])';
// we're escaping the regex reserved characters using '\'
var hasSpecialCharacters = '(?=.*[!@#\$%\^&])';
Затем вы можете использовать их для создания более сложных регулярных выражений, комбинируя их:
// For ES6 with template strings
// 8 characters long AND has numbers AND (has lowercase OR has uppercase)
const weakPasswordRegex = new RegExp(
`^${isEightCharactersLong}${hasNumbers}(${hasLowerCase}|${hasUpperCase}) Я думаю, что вы хотите использовать разные регулярные выражения для разных надежных паролей. Большинство движков регулярных выражений имеют функцию под названием «lookarounds». Это в основном утверждения. Я приведу вам пример, использующий косвенные утверждения.
[110] Затем вы можете использовать их для создания более сложных регулярных выражений, комбинируя их:
);
// For lower ES versions
var weakPasswordRegex = new RegExp(
'^' + isEightCharactersLong + hasNumbers + '(' + hasLowerCase + '|' + hasUpperCase + ') Вы также можете извлечь измерение надежности пароля в отдельную функцию:
function measurePasswordStrength(password) {
var weakPassword = new RegExp('<placeholder>');
var mediumPassword = new RegExp('<placeholder>');
var strongPassword = new RegExp('<placeholder>');
if (strongPassword.test(password)) return 3;
if (mediumPassword.test(password)) return 2;
if (weakPassword.test(password)) return 1;
return 0;
}
[ 117] Тогда ваш PasswordMeter станет намного более читабельным и понятным:
function PasswordMeter(password) {
if (password.length === 0) {
document.getElementById("msg").innerHTML = "";
return;
}
var color = "";
var strength = "";
switch (measurePasswordStrength(password)) {
case 0:
case 1:
strength = "Weak: Keep going...";
color = "red";
break;
case 2:
strength = "Medium: A little better but add more..";
color = "blue";
break;
case 3:
strength = "Strong! Now that is good!";
color = "green";
break;
}
document.getElementById("msg").innerHTML = strength;
document.getElementById("msg").style.color = color;
}
Вы также можете извлечь измерение надежности пароля в отдельную функцию:
function measurePasswordStrength(password) {
var weakPassword = new RegExp('<placeholder>');
var mediumPassword = new RegExp('<placeholder>');
var strongPassword = new RegExp('<placeholder>');
if (strongPassword.test(password)) return 3;
if (mediumPassword.test(password)) return 2;
if (weakPassword.test(password)) return 1;
return 0;
}
[ 117] Тогда ваш PasswordMeter станет намного более читабельным и понятным:
function PasswordMeter(password) {
if (password.length === 0) {
document.getElementById("msg").innerHTML = "";
return;
}
var color = "";
var strength = "";
switch (measurePasswordStrength(password)) {
case 0:
case 1:
strength = "Weak: Keep going...";
color = "red";
break;
case 2:
strength = "Medium: A little better but add more..";
color = "blue";
break;
case 3:
strength = "Strong! Now that is good!";
color = "green";
break;
}
document.getElementById("msg").innerHTML = strength;
document.getElementById("msg").style.color = color;
}
Есть несколько подходов к этому.
Вы можете взять супер ленивый подход, и пусть они вводят только имя файла, а не расширение .txt. В этом случае вы можете добавить .txt к нему, чтобы открыть входной файл.
infile.open(filename + ".txt");
Затем вы просто вызываете
outfile.open(filename + ".code");
. Следующий подход - взять полное имя файла, включая расширение, и просто добавить .code к нему, чтобы вы могли иметь test.txt.code.
Это немного неоднозначно, если это приемлемо или нет.
Наконец, вы можете использовать методы std :: string
find
,
Конечно, если бы это была не домашняя работа, а реальный проект, вы бы, вероятно, сделали это сами - как также как и другие люди, читающие ваш код - польза от использования replace_extension () Boost.Filesystem вместо 114 ваших собственных. Просто нет такой функциональности, которая была бы достаточно простой, чтобы вы не могли выдать ошибку, по крайней мере, в каком-то угловом случае.
Не отдавать его, так как обучение - это весь смысл упражнения, но вот подсказка.
Вы, вероятно, захотите комбинацию find_last_of
и заменить
.
Вот несколько подсказок. У вас уже есть введенное имя файла - вам нужно получить часть имени файла, которая не содержит расширения:
std::string basename(const std::string &filename)
{
// fill this bit in
}
Написав эту функцию, вы можете использовать ее для создания имени нового файла:
std::string codeFile = basename(filename) + ".code";
outFile.open(codeFile);
Псевдокод будет делать что-то вроде
outFilename = filename;
<change outFilename>
outfile.open(outFilename);
Для изменения outFilename посмотрите на strrchr и strcpy в качестве отправной точки (может быть, более подходящие методы - это будет прекрасно работать с символом *)
В Windows (по крайней мере) вы можете использовать _splitpath , чтобы отделить базовое имя от остальных частей, а затем снова собрать их, используя ваш любимый форматировщик строк.
почему бы не использовать строковый метод find_last_of ()
?
std::string new_filename = filename;
size_type result = new_filename.find_last_of('.');
// Does new_filename.erase(std::string::npos) working here in place of this following test?
if (std::string::npos != result)
new_filename.erase(result);
// append extension:
filename.append(".code");
Что вам нужно сделать, это скопировать оригинальное имя файла в новую переменную, где вы можете изменить расширение. Примерно так:
string outFilename;
size_t extPos = filename.rfind('.');
if (extPos != string::npos)
{
// Copy everything up to (but not including) the '.'
outFilename.assign(filename, 0, extPos);
// Add the new extension.
outFilename.append(".code");
// outFilename now has the filename with the .code extension.
}
Возможно, вы могли бы использовать переменную «filename», если вам не нужно сохранять исходное имя файла для дальнейшего использования. В этом случае вы можете просто использовать:
size_t extPos = filename.rfind('.');
if (extPos != string::npos)
{
// Erase the current extension.
filename.erase(extPos);
// Add the new extension.
filename.append(".code");
}
Ключ в том, чтобы посмотреть определение строкового класса C ++ и понять, что делает каждая функция-член. Использование rfind будет выполнять поиск в обратном направлении через строку, и вы не будете случайно попадать в какие-либо расширения в именах папок, которые могут быть частью исходного имени файла (например, «C: \ MyStuff.School \ MyFile.txt»). При работе со смещениями от find, rfind и т. Д. Вы также должны быть осторожны, чтобы правильно использовать их при передаче их в качестве значений другим методам (например,