Comment diviser la chaîne ci-dessous
sample1 : ' test1 "test2" test3 "test four\\"" test" d' output [' test1','"test2"','test3','"test four\\""','test" d'] sample2 : ' test1 test2' output [' test1 test2'] sample3 : ' test1 "sub test2' output [' test1 "sub test2'] sample4 : ' test1 "sub test2"' output [' test1 ','"sub test2"'] sample5 : ' "test1" "sub test2" here' output ['"test1"','"sub test2"', 'here']
en un tableau ['sample', '"test"', '"test2"', '"test3 \\" " ',' sample2 "last '] en utilisant javascript regx?
Quelques exemples d'entrée et de sortie attendue sont ajoutés ci-dessous.
var test = 'sample "test""test2" "test3\\"" sample2"last';
5 Réponses :
Vous pouvez diviser la chaîne par des caractères non alphanumériques, puis supprimer tout élément de longueur 0.
var test = 'sample "test""test2" "test3\"" sample2"'; var array = test.split(/\W/g).filter(e => e.length>0); console.log(array);
les guillemets ne doivent pas être échappés .. vérifiez la question mise à jour
Cela ne donne pas les résultats escomptés, car vous pouvez voir que OP souhaite également capturer les devis en sortie.
Un peu compliqué, mais ça fait le travail:
x " fermées en utilisant la méthode RegExp.exec () à plusieurs reprises
var test = 'sample "test""test2" "test3\\"" sample2"'; var x='@#@',xr= RegExp(x,'g'); var rx=/"[^"]+"/g; // matches "-enclosed strings var a,arr=[]; while (a=rx.exec(test.replace(/\\"/g,x))) arr.push(a[0].replace(/"/g,'').replace(xr,'"')); console.log(arr);
Si vous pouvez utiliser le lookbehind négatif, vous pouvez utiliser ce modèle:
test
.split('')
.reverse()
.join('')
.split(/"(?!\\)/)
.map(i => i.trim())
.filter(i => i != '')
.map(i => i.split('').reverse().join(''))
.reverse()
Notez que le lookbehind négatif est un ajout récent aux moteurs JS. Il peut être utilisé avec V8, qui est utilisé par exemple dans Chrome.
Si vous ne parvenez pas à utiliser la recherche négative, utilisez une solution de contournement: inversez la chaîne, utilisez une anticipation négative, puis inversez à nouveau: p>
test.split(/(?<!\\)"/).map(i => i.trim()).filter(i => i != '')
Modèles utilisés:
"(?! \\) - anticipation négative: correspond à " qui n'est pas suivi de \ (? - lookbehind négatif: correspond à " qui n'est pas précédé de \ Cette expression régulière devrait fonctionner pour vous pour le fractionnement:
var input = [` test1 "test2" test3 "test four\\"" test" d`, ` test1 test2`, ` test1 "sub test2`, `' test1 "sub test2"`, ` "test1" "sub test2" here`];
const re = /\s*"[^"\\]*(?:\\.[^"\\]*)*"\s*|.+?(?="[^"\\]*(?:\\.[^"\\]*)*"|$)/g;
input.forEach(el => {
console.log('<<', el, '>>');
var arr = el.match(re);
arr.forEach(i => console.log(i));
});Code:
/\s*"[^"\\]*(?:\\.[^"\\]*)*"\s*|.+?(?="[^"\\]*(?:\\.[^"\\]*)*"|$)/g
Détails RegEx:
"[^" \\] * (?: \\. [^ "\\] *) *" : correspond à une chaîne entre guillemets en ignorant les guillemets échappés | : OU . +? (? = "[^" \\] * (?: \\. [^ "\\] *) *" | $) : correspond à 1+ caractères doit être suivi d'une chaîne entre guillemets ou d'une fin de ligne. tout fonctionne bien, mais quand j'ajoute sample2 "gga à la fin, il est divisé en 2 éléments du tableau ... mais devrait en être un car les guillemets ne sont pas terminés.
censé travailler la fin de la chaîne de la même manière que vous avez fractionné l'échantillon "à partir de la partie de départ
L'objectif est de diviser les citations complétées .. Dans votre cas exemple, le dernier se divise en 2 éléments de tableau.La ne devrait pas bcoz que la citation n'est pas terminée .so il devrait être considéré comme un seul élément
Non, ce n'est pas correct. sample2 "last est affiché en tant qu'élément unique, comme indiqué dans votre question. Peut-être n'avez-vous pas montré les données correctes en question.
C'est correct.Mais cela échoue quand un espace supplémentaire vient comme 'sample2' last'.Comme comme le dit mon titre (divisé lorsque les guillemets doubles arrivent), il ne devrait pas être divisé pour une chaîne normale comme 'sample last' .. il se sépare ici..peut vous aidez pour ce cas ..
Selon le titre de ma question, la division de la chaîne est basée sur une chaîne fermée complète comme par exemple "demander" "demander \\" 2 "... et non basée sur un espace blanc.
Une solution d'expression rationnelle pure: Cela correspond soit à un (des) espace (s), soit chaînes vides qui sont / + | (?
" mais pas de \" " var test = 'sample "test""test2" "test3\\"" sample2"last';
console.log(test.split(/ +|(?<!\\")(?<=")(?=")/));
C'est correct.Mais cela échoue quand un espace supplémentaire vient comme 'sample2' last'.Comme comme le dit mon titre (divisé lorsque les guillemets doubles arrivent), il ne devrait pas être divisé pour une chaîne normale comme 'sample last' .. il se sépare ici..peut vous aidez pour ce cas ..
Avez-vous essayé quelque chose vous-même?
str = str.replace (/ "\ s +" | "" / g, '","'); var res = str.split (","); essayé mais ne supporte pas échappé et voulait faire les deux par regx.
@Teemu cela signifie zéro ou plus de zéro 'espace'
Si vous souhaitez conserver le caractère de masquage `\` dans votre chaîne, vous devrez le mettre deux fois là-bas, sinon il sera avalé au moment de la génération de chaîne. Je ne peux même pas arriver à le faire paraître double dans ce commentaire: D!
Selon vos règles de fractionnement, le dernier mot «échantillon2» ne doit pas apparaître dans votre tableau de résultats car il n'est pas entre guillemets.
Vous rendez-vous compte des ravages que vous causez en changeant continuellement la question? Je doute que l'une des réponses soit correcte maintenant.
: D oui, qui peut suivre tous ces changements?!?