【问题标题】:Get the line number of a string from body of text从文本正文中获取字符串的行号
【发布时间】:2015-08-14 19:09:06
【问题描述】:

假设我有一个包含两行的文件,我在文件中获得了 indexOf 一个子字符串。它返回 18 找到子字符串的字符。如何找到包含此信息的行?

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

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

【问题讨论】:

  • \n的数量,直到到达行号

标签: javascript string character substring line-breaks


【解决方案1】:

实现此目的的一种可能方法是像您一样找到字符串:

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

【讨论】:

  • 我的错误,不知道我为什么这样做。一定是在考虑 indexOf 而不是我脑海中的那个长度。将编辑原始答案。
  • str 引用什么?
【解决方案2】:
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;
}

避免对字符串进行两次迭代,一次是查找子字符串,一次是查找换行符。

【讨论】:

    【解决方案3】:
    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)
    

    【讨论】:

      猜你喜欢
      • 2015-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-14
      • 1970-01-01
      • 2015-01-02
      • 2012-05-28
      • 1970-01-01
      相关资源
      最近更新 更多