Javascript et regex: split string et garder le séparateur
j'ai une chaîne de caractères:
var string = "aaaaaa<br />† bbbb<br />‡ cccc"
et je voudrais partager cette chaîne avec le délimiteur <br /> suivi d'un caractère spécial.
Pour ce faire, j'utilise ceci:
string.split(/<br />&#?[a-zA-Z0-9]+;/g);
j'obtiens ce dont j'ai besoin, sauf que je perds le délimiteur. Voici l'exemple: http://jsfiddle.net/JwrZ6/1 /
comment conserver le délimiteur?
6 réponses
Utiliser anticipation positif , de sorte que l'expression régulière affirme que le caractère spécial existe, mais ne fait pas le match:
string.split(/<br \/>(?=&#?[a-zA-Z0-9]+;)/g);
Voir en action:
var string = "aaaaaa<br />† bbbb<br />‡ cccc";
console.log(string.split(/<br \/>(?=&#?[a-zA-Z0-9]+;)/g));
mise à Jour: correction d'une faute (déplacé littérale ; à l'intérieur d'anticipation parens)
j'avais un problème similaire mais légèrement différent. Quoi qu'il en soit, voici des exemples de trois scénarios différents pour savoir où conserver le délimiteur.
"1、2、3".split("、") == ["1", "2", "3"]
"1、2、3".split(/(、)/g) == ["1", "、", "2", "、", "3"]
"1、2、3".split(/(?=、)/g) == ["1", "、2", "、3"]
"1、2、3".split(/(?!、)/g) == ["1、", "2、", "3"]
"1、2、3".split(/(.*?、)/g) == ["", "1、", "", "2、", "3"]
Avertissement: Le quatrième ne fonctionnera que pour diviser les caractères uniques. ConnorsFan présente une alternative :
// Split a path, but keep the slashes that follow directories
var str = 'Animation/rawr/javascript.js';
var tokens = str.match(/[^\/]+\/?|\//g);
si vous enveloppez le délimiteur dans des paranthèses, il fera partie du tableau retourné.
string.split(/(<br \/>&#?[a-zA-Z0-9]+);/g);
// returns ["aaaaaa", "<br />†", "bbbb", "<br />‡", "cccc"]
en fonction de la partie que vous voulez garder changer quel sous-groupe vous correspond
string.split(/(<br \/>)&#?[a-zA-Z0-9]+;/g);
// returns ["aaaaaa", "<br />", "bbbb", "<br />", "cccc"]
vous pourriez améliorer l'expression en ignorant le cas des lettres chaîne.split (/()?[a-z0-9]+;/gi);
et vous pouvez associer des groupes prédéfinis comme ceci: \d égale [0-9] et \w égale [a-zA-Z0-9_] . Ça veut dire que ton expression pourrait ressembler à ça.
string.split(/<br \/>(&#?[a-z\d]+;)/gi);
Il y a un bon Expression Régulière de Référence sur JavaScriptKit .
répondit-il ici aussi JavaScript Split Expression Régulière garder le délimiteur
utiliser le (?=modèle) d'anticipation motif de l'expression régulière exemple
var string = '500x500-11*90~1+1';
string = string.replace(/(?=[$-/:-?{-~!"^_`\[\]])/gi, ",");
string = string.split(",");
vous obtiendrez le résultat suivant.
[ '500x500', '-11', '*90', '~1', '+1' ]
peut aussi être divisé directement
string = string.split(/(?=[$-/:-?{-~!"^_`\[\]])/gi);
donnant le même résultat
[ '500x500', '-11', '*90', '~1', '+1' ]
une fonction d'extension divise la chaîne en sous-chaîne ou en RegEx et le délimiteur est placé selon le second paramètre en avant ou en arrière.
String.prototype.splitKeep = function (splitter, ahead) {
var self = this;
var result = [];
if (splitter != '') {
var matches = [];
// Getting mached value and its index
var replaceName = splitter instanceof RegExp ? "replace" : "replaceAll";
var r = self[replaceName](splitter, function (m, i, e) {
matches.push({ value: m, index: i });
return getSubst(m);
});
// Finds split substrings
var lastIndex = 0;
for (var i = 0; i < matches.length; i++) {
var m = matches[i];
var nextIndex = ahead == true ? m.index : m.index + m.value.length;
if (nextIndex != lastIndex) {
var part = self.substring(lastIndex, nextIndex);
result.push(part);
lastIndex = nextIndex;
}
};
if (lastIndex < self.length) {
var part = self.substring(lastIndex, self.length);
result.push(part);
};
// Substitution of matched string
function getSubst(value) {
var substChar = value[0] == '0' ? '1' : '0';
var subst = '';
for (var i = 0; i < value.length; i++) {
subst += substChar;
}
return subst;
};
}
else {
result.add(self);
};
return result;
};
Le test:
test('splitKeep', function () {
// String
deepEqual("1231451".splitKeep('1'), ["1", "231", "451"]);
deepEqual("123145".splitKeep('1', true), ["123", "145"]);
deepEqual("1231451".splitKeep('1', true), ["123", "145", "1"]);
deepEqual("hello man how are you!".splitKeep(' '), ["hello ", "man ", "how ", "are ", "you!"]);
deepEqual("hello man how are you!".splitKeep(' ', true), ["hello", " man", " how", " are", " you!"]);
// Regex
deepEqual("mhellommhellommmhello".splitKeep(/m+/g), ["m", "hellomm", "hellommm", "hello"]);
deepEqual("mhellommhellommmhello".splitKeep(/m+/g, true), ["mhello", "mmhello", "mmmhello"]);
});
j'ai utilisé ceci:
String.prototype.splitBy = function (delimiter) {
var
delimiterPATTERN = '(' + delimiter + ')',
delimiterRE = new RegExp(delimiterPATTERN, 'g');
return this.split(delimiterRE).reduce((chunks, item) => {
if (item.match(delimiterRE)){
chunks.push(item)
} else {
chunks[chunks.length - 1] += item
};
return chunks
}, [])
}
sauf que vous ne devriez pas déconner avec String.prototype , donc voici une version de fonction:
var splitBy = function (text, delimiter) {
var
delimiterPATTERN = '(' + delimiter + ')',
delimiterRE = new RegExp(delimiterPATTERN, 'g');
return text.split(delimiterRE).reduce(function(chunks, item){
if (item.match(delimiterRE)){
chunks.push(item)
} else {
chunks[chunks.length - 1] += item
};
return chunks
}, [])
}
pour que tu puisses faire:
var haystack = "aaaaaa<br />† bbbb<br />‡ cccc"
var needle = '<br \/>&#?[a-zA-Z0-9]+;';
var result = splitBy(string, haystack)
console.log( JSON.stringify( result, null, 2) )
et vous finirez avec:
[
"<br />† bbbb",
"<br />‡ cccc"
]