2015-08-14 3 views
1

Предположим, у меня есть файл с двумя строками, и я получаю indexOf подстроку в файле. Он возвращает с 18 символом, на котором находится подстрока. Как я могу найти строку с этой информацией?Получить номер строки строки из текста текста

var file = [ 
    'var foo = "hello"', 
    'console.log(foo)', 
].join('\n') 

var char = file.indexOf('console') // => 18 
var line = lineOfChar(file, char) // => 2 
+4

подсчитайте количество '\ n', пока не достигнете номера строки – depperm

ответ

7

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

var index = file.indexOf('console'); // => 18 

Затем использовать этот индекс, чтобы сделать подстроку, содержащую все до этого индекса:

var tempString = str.substring(0, index); 

И, наконец, мы рассчитываем вхождения \n:

var lineNumber = tempString.split('\n').length; 
// You should do - 1 if you want your 'first' line to be 0 
+1

Моя ошибка, не знаю, почему я это сделал. Должно быть, мы думали о indexOf, а не о том, что длина в моей голове. Изменит исходный ответ. –

+0

Что такое ссылка str? –

0
var assert = require('assert') 

var file = [ 
    'var alpha = "hello"', 
    'var beta = "hello"', 
    'var gamma = "hello"', 
    'var delta = "hello"', 
    'var episilon = "hello"' 
].join('\n') 

function getLine (body, charOrString) { 
    if (!body) return false 
    if (!charOrString) return false 
    var char = (typeof charOrString === 'string') ? body.indexOf(charOrString) : charOrString 
    var subBody = body.substring(0, char) 
    if (subBody === '') return false 
    var match = subBody.match(/\n/gi) 
    if (match) return match.length + 1 
    return 1 
} 

assert.equal(getLine(file, 'missing'), false) 
assert.equal(getLine(file, 'alpha'), 1) 
assert.equal(getLine(file, 'beta'), 2) 
assert.equal(getLine(file, 'gamma'), 3) 
assert.equal(getLine(file, 'delta'), 4) 
assert.equal(getLine(file, 'episilon'), 5) 
1
function lineOf(text, substring){ 
    var line = 0, matchedChars = 0; 

    for (var i = 0; i < text.length; i++) { 
    text[i] === substring[matchedChars] ? matchedChars++ : matchedChars = 0; 

    if (matchedChars === substring.length){ 
     return line;     
    } 
    if (text[i] === '\n'){ 
     line++; 
    } 
    } 

    return -1; 
} 

Избегает Перебор строку дважды, один раз, чтобы найти подстроку и снова, чтобы найти новые строки.

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