danik.js,
Все что ты показал -- это тупая подстановка. Цитата:
|
danik.js,
Ты вообще собственно, сделал через жопу то, что и так можно сделать, причем тупейшим образом. Никакой генерации я в твоем тупорылом коде не увидел. Ты, видно, вообще не представляшь, что тако генерация. Слив засчитан. |
Цитата:
|
Пример генерации номера телефона по шаблону:
<script src="http://libs.useso.com/js/require.js/2.1.11/require.min.js"></script> <script> require.config({ baseUrl: "http://jex.im/regulex", }); require(['dest/parse'], function(parse) { var re = '\\+7 \\(\\d{3}\\) \\d{3}\\-\\d{2}\\-\\d{2}'; var root = parse(re); alert(generateMatchingString(root.tree)); }); var randomClass = { 'd': function() { return Math.round(Math.random() * 9); } } var generateNode = { exact: function(node) { return node.chars; }, dot: function(node) { return String.fromCharCode(65 + Math.round(Math.random() * 25)); }, choice: function(node) { return generateMatchingString(node.branches[0]); }, repeat: function(node) { var result = []; for (var i = 0; i < node.repeat.min; i++) { result.push(generateNode[node.type](node)); } return result.join(''); }, charset: function(node) { if (node.classes) { return randomClass[node.classes[0]](); } } }; function generateMatchingString(tree) { var chunks = tree.map(function(node){ if (node.repeat) return generateNode.repeat(node); else return generateNode[node.type](node); }); return chunks.join(''); } </script> |
danik.js,
Ну, это еще куда ни шло, вроде похоже на правду, да. |
Добавил поддержку символьных классов (кроме исключающих) и групп.
<meta charset="utf-8"> <form id="form"> <p><label>Регулярка:</label><input name="input"> <button name="run" type="button">Герерировать</button></p> <p><label>Результат:</label><input name="output"></p> </form> <script src="http://libs.useso.com/js/require.js/2.1.11/require.min.js"></script> <script> require.config({ baseUrl: "http://jex.im/regulex", }); require(['dest/parse'], function(parse) { var form = document.forms.form; form.run.onclick = function() { var root = parse(form.input.value); form.output.value = generateMatchingString(root.tree); } }); var charClasses = { 'd': {ranges: ['09']}, 's': {chars: ' \f\n\r\t\v'}, 'w': {ranges: ['09', 'az', 'AZ'], chars: '_'} }; function rangeToChars(range) { var chars = ''; for (var i = range.charCodeAt(0); i < range.charCodeAt(1); i++) { chars += String.fromCharCode(i); } return chars; } function classToChars(charClass) { var chars = ''; var derivedChars = charClasses[charClass]; if (derivedChars.chars) chars += derivedChars.chars; if (derivedChars.ranges) chars += derivedChars.ranges.map(rangeToChars).join(''); return chars; } function charSet(chars, classes, ranges) { chars += classes.map(classToChars).join(''); chars += ranges.map(rangeToChars).join(''); return chars; } var generateNode = { exact: function(node) { return node.chars; }, dot: function(node) { return String.fromCharCode(65 + Math.round(Math.random() * 25)); }, choice: function(node) { return generateMatchingString(node.branches[Math.round(Math.random()*node.branches.length)]); }, repeat: function(node) { var result = []; for (var i = 0; i < node.repeat.min; i++) { result.push(generateNode[node.type](node)); } return result.join(''); }, charset: function(node) { var chars = charSet(node.chars, node.classes, node.ranges); return chars[Math.round(Math.random()*chars.length)]; }, group: function(node) { return generateMatchingString(node.sub); } }; function generateMatchingString(tree) { var chunks = tree.map(function(node){ if (node.repeat) return generateNode.repeat(node); else return generateNode[node.type](node); }); return chunks.join(''); } </script> |
Цитата:
|
А всё-таки, что делать с несколькими lookahead в регексе?
/...(?=...)(?=...)(?!...)/и т.д. |
Цитата:
|
Зачем вообще это всё нужно? Если нужно просто сгенерировать строку, в которой будут в определённых местах цифры, а в других - буквы, то регулярка тут не нужна.
Лучше уж написать ф-цию, которая будет понимать что и где генерировать, причём чтобы ф-ция использовала какой-нибудь свой "синтаксис", типо: function genStr(pattern) { //... } alert( genStr('$d5$w3$W3$d[0-5]6') ); //19435fgtMZP302213 $Type[from-to]N Где: - Type - тип генерируемого значения (n - цифра, w - любая латинская буква в нижнем регистре, W - любая латинская буква в верхнем регистре). - [form-to] - допустимые значения (от - до). - N - количество генераций значения. Например: $d - сгенерирует строку из одного случайно числа $d5 - сгенерирует строку из 5 случайных цифр $d[3-7] - сгенерирует строку из одного случайного числа в диапазоне от 3 до 7 включительно. $d[4-9]3 - сгенерирует строку из трёх случайных чисел в диапазоне от 4 до 9 включительно. $w10 - сгенерирует строку из 10 случайных букв латинского алфавита в нижнем регистре. $W[a-f]5 - сгенерирует строку из 5 случайных букв в диапазоне от "a" до "f", нижнем регистре латинского алфавита. $w$d3$w5 - "случайная буква н.р. + 3 случайные цифры + 5 случайных букв н.р." Ну это так, как идея. Можно конечно всё это дело расширить или вообще сделать по другому. :) |
Часовой пояс GMT +3, время: 18:58. |