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? P>
6 Réponses :
Oui, avec un travail semi-maladroit autour.
http://jsfiddle.net/tylermwashburn/ rbqn / p>
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. P>
https://github.com/zaach/jsonlint P>
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 code>), en prenant la sous-chaîne ( mystring. Substrage (0, Index) CODE>), le scindant sur les nouvelles lignes et compter le nombre d'éléments dans la matrice. P>
créer une fonction qui renvoie le numéro de ligne du premier match p> < Pré> xxx pré>
créer une fonction qui renvoie les numéros de ligne pour chaque match p> violon p> h2>
Je le ferais de la manière opposée
Je pense qu'il aura de meilleures performances en raison d'une seule régexp p>
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)))
Au lieu de la méthode Code> Matchlinenumber Code>, vous pouvez calculer le numéro de ligne ainsi: const ligne = m.input.substr (0, m.index) .Match (/ \ n / g) + 1; code>
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}`
)
);