2011-12-29 2 views
0

У меня есть строка, содержащая некоторый код. Я хочу внести некоторые изменения. Существует цикл for, который я хочу изменить с помощью js. Цикл:Изменение цикла for в строке

"for i in 0..10 loop" 

Я хочу, чтобы это было:

"for (var i=0; i<10; i++)" 

Это звучит мне очень сложно. Какой должен быть самый простой подход?

+1

Если это цикл будет выполнение? Почему это в строке? – Purag

+0

Не очень сложный, предполагая, что шаблон исправлен - ** для ** [имя переменной] ** в ** [начальный индекс] ** .. ** [конечный индекс] ** цикл ** - полужирный - фиксированный слова. Если это так, просто разделите пространство и возьмите нужные вещи. –

+0

Нет его не выполняет. Я пытаюсь преобразовать код в js. – Rckt

ответ

1

Вот способ сделать это, но, вероятно, не самый лучший:

var str = "for i in 0..10 loop", 
    str = str.replace("i in ", "(var i="), 
    str = str.replace("..", "; i<"), 
    str = str.replace(" loop", "; i++)"); 
console.log(str); 

Example.

+0

Фантастический метод. Благодарю. – Rckt

2

Основываясь на мой комментарий здесь простая реализация:

var before = "for i in 0..10 loop"; 
var after = Translate(before); 

function Translate(command) { 
    var tokens = command.split(" "); 
    if (tokens.length != 5) 
     return "ERROR: invalid command (wrong number of tokens)"; 
    if (tokens[0] != "for" || tokens[2] != "in" || tokens[4] != "loop") 
     return "ERROR: invalid command (syntax error)"; 
    var indices = tokens[3].split(".."); 
    if (indices.length != 2) 
     return "ERROR: invalid command (invalid indices format)"; 
    var startIndex = parseInt(indices[0], 10); 
    var endIndex = parseInt(indices[1], 10); 
    if (isNaN(startIndex) || isNaN(endIndex)) 
     return "ERROR: invalid command (illegal indices)"; 
    var varName = tokens[1]; 
    return "for (var " + varName + "=" + startIndex + "; " + varName + "<" + endIndex + "; " + varName + "++)"; 
} 

Live test case.

Это не идеально, например, вы можете дополнительно проверить имя переменной является легальным т.е. начинаться с английской буквы, а не зарезервированное слово и т.д.

+0

Большое спасибо за вашу помощь. – Rckt

2

Вы можете использовать сопоставление регулярных выражений, чтобы вытащить части вы заинтересованы.

var string_to_match = 'for i in 0..10 loop', 
    re = /for ([A-z]*) in (\d*)\.\.(\d*) loop/, 
    data = re.exec(string_to_match); 

// data contains: 
// ["for i in 0..10 loop", "i", "0", "10"] 

for(i = data[2]; i < data[3]; i++) { 
    console.log(i); 
} 
0

Вы можете попробовать скачать это регулярное выражение ^for (.+) in (\d+)\.\.(\d+) loop$ и заменить на for (var \1=\2; \1 < \3; \1++).

Попробуйте на http://www.solmetra.com/scripts/regex/, например ...

Смежные вопросы