Angenommen, ich habe eine Datei mit zwei Zeilen und erhalte die Teilzeichenfolge indexOf
in der Datei. Es gibt mit 18
das Zeichen zurück, unter dem sich die Teilzeichenfolge befindet. Wie finde ich die Zeile mit diesen Informationen?
var file = [
'var foo = "hello"',
'console.log(foo)',
].join('\n')
var char = file.indexOf('console') // => 18
var line = lineOfChar(file, char) // => 2
3
ThomasReggi
14 Aug. 2015 im 22:09
3 Antworten
Beste Antwort
Eine Möglichkeit, dies zu erreichen, besteht darin, die Zeichenfolge zu finden, mit der Sie gearbeitet haben:
var index = file.indexOf('console'); // => 18
Verwenden Sie dann diesen Index, um einen Teilstring zu erstellen, der alles vor diesem Index enthält:
var tempString = str.substring(0, index);
Und zuletzt zählen wir die Vorkommen von \n
:
var lineNumber = tempString.split('\n').length;
// You should do - 1 if you want your 'first' line to be 0
11
Wout De Rooms
14 Aug. 2015 im 19:46
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)
0
ThomasReggi
14 Aug. 2015 im 19:21
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;
}
Vermeidet es, zweimal über die Zeichenfolge zu iterieren, einmal, um den Teilstring zu finden, und erneut, um die Zeilenumbrüche zu finden.
1
sheilak
14 Aug. 2015 im 19:33