J'essaie de faire correspondre chaque \t
dans l'espace blanc de tête d'une ligne pour que je puisse les remplacer par deux espaces. Ceci est trivial avec un lookbehind non borné (c'est-à-dire de longueur variable).
text.replace(/(?<=^\s*)\t/gm, ' ')
Malheureusement, ce code s'exécute sur iOS, et pour une raison quelconque, Safari et iOS ont encore à mettre en œuvre les rétrospectives et encore moins des balises illimitées.
Je sais qu'il y a solutions de contournement pour les rétroviseurs mais je n'arrive pas à faire fonctionner celles que j'ai examinées.
Je préférerais ne pas capturer de caractères en dehors de chaque onglet, mais s'il n'y a pas d'autre moyen, je pourrais capturer les caractères autour des onglets dans des groupes de capture et ajouter $1
etc, à ma chaîne de remplacement.
Exemple de code de test
const text = `
\t\ta
\t b
\t \t c\td \te
`
const expected = `
a
b
c\td \te
`
// throws error in iOS, which does not support lookbehinds
// const regex = /(?<=^\s*)\t/gm;
const regex = /to-do/gm;
const result = text.replace(regex, ' ')
console.log(`Text: ${text}`)
console.log(`Expected: ${expected}`)
console.log(`Result: ${result}`)
console.log(JSON.stringify([ expected, result ], null, 2))
if (result === expected) {
console.info('Success! ')
} else {
console.error('Failed ')
}
Mise à jour
Une solution moins qu'idéale serait d'utiliser deux regex et une fonction de remplacement.
const text = `
\t\ta
\t b
\t \t c\td \te
`
const expected = `
a
b
c\td \te
`
const result = text.replace(/^\s*/gm, m => m.replace(/\t/g, ' '))
if (result === expected) {
console.info('Success! ')
} else {
console.error('Failed ')
}
Encore une fois, ce n'est pas l'idéal. Je suis un puriste.