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