12.10.2019, 16:57
|
Профессор
|
|
Регистрация: 02.01.2019
Сообщений: 151
|
|
Как проверить комбинацию символов в строке?
Нужно реализовать функцию
function verif(<тут переданная строка>) {
// тело функции
}
которая принимает строки вида:
verif("#АБВГДЕЁЖЗИЙ(КЛМНОПРС)ТУФХЦЧШЩЬЫЪЭЮЯ#");
verif("#абвгдеёжзийклмнопрстуфхцчшщьыъэюя#");
verif("*АБВГДЕЁЖЗИЙКЛМН(ОПРСТУФХЦЧШЩЬЫЪЭЮЯ*");
И вернёт true если в строке есть комбинация из символов ( и ), * и *, # и #
Но вернёт false если внутри комбинации встретиться символ из другой комбинации, типа: При этом
|
|
12.10.2019, 18:17
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,108
|
|
CryNet,
вариант ...
function verif(str) {
const reg = /(^[*#])(?![*#()а-яё]*?\1$)|[(](?![*#()а-яё]*?[)])/gi;//
return !reg.test(str)
}
console.log(verif("#АБВГДЕЁЖЗИЙ(КЛМНОПРС)ТУФХЦЧШЩЬЫЪЭЮЯ#")); //true
console.log(verif("*АБВГДЕЁЖЗИЙКЛМН(ОПРСТУФХЦЧШЩЬЫЪЭЮЯ*")); //false
console.log(verif("#абвгдеёжзийклмнопрстуфхцчшщьыъэюя#")); //true
|
|
12.10.2019, 18:34
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
рони, не всему отвечает, например:
console.log(verif("#АБВГДЕЁЖЗИЙ(КЛМ ОПРС)ТУФХЦЧШЩЬ)ЫЪЭЮЯ#")) будет true, но должно быть false.
|
|
12.10.2019, 19:29
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,108
|
|
laimas,
если так?
function verif(str) {
const reg = /(^[*#])[()а-яё]*\1$/i;
const rg = /[(][^()]*?[)]/;
const r = /[()]/;
if(!reg.test(str)) return false;
for (; rg.test(str); ) {rg.lastIndex = 0; str = str.replace(rg, ''); rg.lastIndex = 0;}
return !r.test(str)
}
console.log(verif("#АБВГДЕЁЖЗИЙ(КЛМНОПРС)ТУФХЦЧШЩЬЫЪЭЮЯ#")); //true
console.log(verif("*АБВГДЕЁЖЗИЙКЛМН(ОПРСТУФХЦЧШЩЬЫЪЭЮЯ*")); //false
console.log(verif("#абвгдеёжзийклмнопрстуфхцчшщьыъэюя#")); //true
console.log(verif("#АБВГДЕЁЖЗИЙ(КЛМНОПРС)ТУФХЦЧШЩЬЫ)ЪЭЮЯ#")); //false
|
|
12.10.2019, 19:57
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Ну если скобки в скобках недопустимы, то тоже не пойдет.
|
|
12.10.2019, 20:33
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
рони, видимо лучше не напрягать разборкой по различным выражениям, а получить массив посимвольный, проверить крайние, затем срез 1, -1 обойти циклом, проверяя - если допустимый символ (не # или *), продолжаем, иначе если ")", а открывающая скобка не запоминалась, то ошибка, иначе очистить открывающую скобку. Если "(" и следующий индекс не символ разрешенный, то ошибка, иначе запомнить открывающую скобку.
|
|
12.10.2019, 20:39
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,108
|
|
laimas,
подожду, может уже достаточно.
|
|
12.10.2019, 20:41
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от рони
|
может уже достаточно
|
Может быть , но странное если такие условия и при этом можно "#АБВГДЕЁЖ(ЗИЙ(КЛМНОПРС)ТУФ) ХЦЧШЩЬЫЪЭЮЯ#"
|
|
12.10.2019, 21:02
|
Профессор
|
|
Регистрация: 02.01.2019
Сообщений: 151
|
|
Сообщение от рони
|
CryNet,
function verif(str) {
const reg = /(^[*#])(?![*#()а-яё]*?\1$)|[(](?![*#()а-яё]*?[)])/gi;
|
Блин. Сложно. Если нужно будет добавить новые символы или условие, то я запутаюсь. Но всё равно спасибо
|
|
12.10.2019, 21:53
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
Я не очень понял, что требуется. Это разновидность задачи о проверке скобочной целостности с тремя видами скобок?
|
|
|
|