Создание строки по регулярному выражению
Не нашёл ничего подобного. Есть ли юзерские функции для создание строки по регулярному выражению?
|
Поясни.
|
Так чтоли?)))
alert(/a{,3}/.toString())
|
tsigel,
Нет. Есть регулярное выражение. Нужна функция, которая создаст строку, которая, при тесте, даёт совпадение. Пример var a = /\w/;создаст строку, в которой есть латинские буквы, цифры и знак подчёркивания. var a = /\W/;создаст строку, в которой нет символов лат. алфавита, цифр и знака подчёркивания. |
2chan,
Очень похоже на создания бота для регистрации где-либо) Не думаю что есть такие готовые скрипты. |
Думаю нужно найти реализацию машины регулярных выражений на требуемом тебе языке (JS?), и уже дальше думать.
|
Видимо, придется писать самостоятельно.
"конечные автоматы" и всё такое. на первый взгляд нечего сверхестественного нет. |
tsigel,
А так-же генерации пассов, создания валидных случайных имён... В общем, много для чего. |
Цитата:
|
Цитата:
а ещё бывают регексы с lookahead, причем последних может быть несколько (и некоторые из них отрицательные). вот тут да, суровый паззл, головоломный.. |
Странное чувство. Зашел в trending гитхаба
И первой же строкой идет вот такая вот штуковина: JavaScript Regular Expression Parser & Visualizer. http://jex.im/regulex/ |
danik.js,
В чем же странность твоего чувства? Какое отношение парсер, а, тем-более, "visualizer" имеют к генерации строк по регекспу? |
Да? А мне показалось что все очевидно. По крайней мере я тут же прикинул план решения.
Видимо у тебя с этим трудности. |
danik.js,
вот тебе регулярное выражение f.o вот тебе его парсер /f\.o/ сгенерируй мне выходные слова |
Цитата:
И как ты себе представляешь генерацию всех вариантов для регулярки x* ? |
<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 = 'krutoy.лох';
var root = parse(re);
alert(generateMatchingString(root.tree));
});
var generateNode = {
exact: function(node) {
return node.chars;
},
dot: function(node) {
return '*';
},
choice: function(node) {
return generateMatchingString(node.branches[0]);
}
};
function generateMatchingString(tree) {
var chunks = tree.map(function(node){
return generateNode[node.type](node);
});
return chunks.join('');
}
</script>
Узлы backref, repeat, empty, charset и тд предлагаю реализовать топик-стартеру. Либо раздел Работа. |
Цитата:
alert("krutoy.loh".replace(/\./, "*"))
? Или ты сам идиот? |
Цитата:
|
Цитата:
|
Короче, ди нах троль. ТС поставил задачу, я показал как ее можно решить. Можешь дальше ссаться кипятком.
|
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, время: 05:54. |