Как проверить комбинацию символов в строке?
Нужно реализовать функцию
function verif(<тут переданная строка>) {
// тело функции
}
которая принимает строки вида:
Но вернёт false если внутри комбинации встретиться символ из другой комбинации, типа:
|
CryNet,
вариант ...
function verif(str) {
const reg = /(^[*#])(?![*#()а-яё]*?\1$)|[(](?![*#()а-яё]*?[)])/gi;//
return !reg.test(str)
}
console.log(verif("#АБВГДЕЁЖЗИЙ(КЛМНОПРС)ТУФХЦЧШЩЬЫЪЭЮЯ#")); //true
console.log(verif("*АБВГДЕЁЖЗИЙКЛМН(ОПРСТУФХЦЧШЩЬЫЪЭЮЯ*")); //false
console.log(verif("#абвгдеёжзийклмнопрстуфхцчшщьыъэюя#")); //true
|
рони, не всему отвечает, например:
console.log(verif("#АБВГДЕЁЖЗИЙ(КЛМ ОПРС)ТУФХЦЧШЩЬ)ЫЪЭЮЯ#")) будет true, но должно быть false. |
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
|
Ну если скобки в скобках недопустимы, то тоже не пойдет.
|
рони, видимо лучше не напрягать разборкой по различным выражениям, а получить массив посимвольный, проверить крайние, затем срез 1, -1 обойти циклом, проверяя - если допустимый символ (не # или *), продолжаем, иначе если ")", а открывающая скобка не запоминалась, то ошибка, иначе очистить открывающую скобку. Если "(" и следующий индекс не символ разрешенный, то ошибка, иначе запомнить открывающую скобку.
|
laimas,
подожду, может уже достаточно. |
Цитата:
|
Цитата:
|
Я не очень понял, что требуется. Это разновидность задачи о проверке скобочной целостности с тремя видами скобок?
|
Цитата:
|
|
Цитата:
То есть '****' аналогична '()()', но не '(())', так? |
так :)
|
var config = {
'(': ')',
'{': '}',
'[': ']',
'<': '>',
'*': '*',
'#': '#'
};
function checkParentheses(config, str) {
if (!str || !config) { return true; }
var stack = [];
var closeChars = Object.create(null);
Object.keys(config).forEach(function(open) {
var close = config[open];
closeChars[close] = open !== close;
});
for (var i = 0; i < str.length; ++i) {
var char = str.charAt(i);
var isClose = closeChars[char];
var closeForChar = config[char];
if (isClose) {
if (!stack.length || stack.pop() !== char) {
return false;
}
} else if (closeForChar) {
stack.push(closeForChar);
}
if (char === closeForChar) {
closeChars[char] = !closeChars[char];
}
}
return !stack.length;
}
alert(checkParentheses(config, '(aaa*hjhg*)'));
alert(checkParentheses(config, '(aaa*hjhg)'));
Добавить новые символы будет нетрудно. Если открывашка совпадает с закрывашкой, то режим для символа переключается, начинаясь с открывашки |
| Часовой пояс GMT +3, время: 02:49. |