9
votes

Numéro de ligne des caractères correspondants dans JS / NODE.JS

est-il possible de trouver le numéro de ligne des caractères correspondants REGEX pour des entrées multilignes multilignes (tels que des fichiers) dans JavaScript ou Node.js?


0 commentaires

6 Réponses :


7
votes

Oui, avec un travail semi-maladroit autour.

http://jsfiddle.net/tylermwashburn/ rbqn / xxx


0 commentaires

3
votes

C'est peut-être une bonne idée d'utiliser un générateur d'analyseurs. Zach Carter's Jison rapporte les numéros de ligne. Voici un exemple d'un petit utilitaire qui utilise Jison pour analyser Json et signaler les erreurs avec des numéros de ligne. Ce peut être un bon point de départ.

https://github.com/zaach/jsonlint

Pour une solution minimale, je pourrais essayer d'obtenir l'index d'une regex à l'aide de la méthode Exec ( /myregex/.exec (mystring) .index ), en prenant la sous-chaîne ( mystring. Substrage (0, Index) ), le scindant sur les nouvelles lignes et compter le nombre d'éléments dans la matrice.


0 commentaires

4
votes

Comment obtenir le numéro de ligne par index de chaîne xxx

utile

créer une fonction qui renvoie le numéro de ligne du premier match < Pré> xxx

créer une fonction qui renvoie les numéros de ligne pour chaque match xxx

violon


0 commentaires

0
votes

Je le ferais de la manière opposée

Je pense qu'il aura de meilleures performances en raison d'une seule régexp xxx


0 commentaires

0
votes

L'objet code> correspondant code> a à la fois l'index de correspondance et le texte d'origine. Vous pouvez ainsi compter efficacement les pauses de ligne en utilisant uniquement la correspondance code>.

P >

/**
 * Return the line number of the match, or -1 if there is no match.
 */
function matchLineNumber(m) {
  if (!m) {
    return -1
  }
  let line = 1
  for (let i = 0; i < m.index; i++) {
    if (m.input[i] == '\n') {
      line++;
    }
  }
  return line
}


const rx = /foo/
const ex1 = `foo`
const ex2 = `
hello
foo
`
const ex3 = `
hello
`

console.log(matchLineNumber(rx.exec(ex1)))
console.log(matchLineNumber(rx.exec(ex2)))
console.log(matchLineNumber(rx.exec(ex3)))


1 commentaires

Au lieu de la méthode Matchlinenumber , vous pouvez calculer le numéro de ligne ainsi: const ligne = m.input.substr (0, m.index) .Match (/ \ n / g) + 1;



0
votes

merci @shanimal J'ai changé votre code pour ajouter la position de la colonne:

p>

function lineNumberByIndex(index, string) {
  const re = /^[\S\s]/gm;
  let line = 0,
    match;
  let lastRowIndex = 0;
  while ((match = re.exec(string))) {
    if (match.index > index) break;
    lastRowIndex = match.index;
    line++;
  }
  return [Math.max(line - 1, 0), lastRowIndex];
}

const findOccurrences = (needle, haystack) => {
  let match;
  const result = [];
  while ((match = needle.exec(haystack))) {
    const pos = lineNumberByIndex(needle.lastIndex, haystack);
    result.push({
      match,
      lineNumber: pos[0],
      column: needle.lastIndex - pos[1] - match[0].length
    });
  }
  return result;
};

const text = `Lorem ipsum dolor sit amet, consectetur adipiscing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris
nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim id est laborum.`;
findOccurrences(/dolor/gim, text).forEach(result =>
  console.log(
    `Found: ${result.match[0]} at ${result.lineNumber}:${result.column}`
  )
);


0 commentaires