Réponses:
Tu peux essayer ça
var mySubString = str.substring(
str.lastIndexOf(":") + 1,
str.lastIndexOf(";")
);
Vous pouvez également essayer ceci:
var str = 'one:two;three';
str.split(':').pop().split(';')[0]; // returns 'two'
str.split(':').pop().split(';')[0]
peut être plus rapide que d'utiliser.shift()
Utilisation split()
var s = 'MyLongString:StringIWant;';
var arrStr = s.split(/[:;]/);
alert(arrStr);
arrStr
contiendra toute la chaîne délimitée par :
ou ;
Alors accédez à chaque chaîne viafor-loop
for(var i=0; i<arrStr.length; i++)
alert(arrStr[i]);
\[(.*?)\]
---> En bref, vous devez échapper les crochets, car [] désigne la classe de caractères dans l'expression régulière.
@Babasaheb Gosavi Answer est parfait si vous avez une occurrence des sous-chaînes (":" et ";"). mais une fois que vous avez plusieurs occurrences, cela peut devenir un peu délicat.
La meilleure solution que j'ai trouvée pour travailler sur plusieurs projets consiste à utiliser quatre méthodes à l'intérieur d'un objet.
Alors assez parlé, voyons le code:
var getFromBetween = {
results:[],
string:"",
getFromBetween:function (sub1,sub2) {
if(this.string.indexOf(sub1) < 0 || this.string.indexOf(sub2) < 0) return false;
var SP = this.string.indexOf(sub1)+sub1.length;
var string1 = this.string.substr(0,SP);
var string2 = this.string.substr(SP);
var TP = string1.length + string2.indexOf(sub2);
return this.string.substring(SP,TP);
},
removeFromBetween:function (sub1,sub2) {
if(this.string.indexOf(sub1) < 0 || this.string.indexOf(sub2) < 0) return false;
var removal = sub1+this.getFromBetween(sub1,sub2)+sub2;
this.string = this.string.replace(removal,"");
},
getAllResults:function (sub1,sub2) {
// first check to see if we do have both substrings
if(this.string.indexOf(sub1) < 0 || this.string.indexOf(sub2) < 0) return;
// find one result
var result = this.getFromBetween(sub1,sub2);
// push it to the results array
this.results.push(result);
// remove the most recently found one from the string
this.removeFromBetween(sub1,sub2);
// if there's more substrings
if(this.string.indexOf(sub1) > -1 && this.string.indexOf(sub2) > -1) {
this.getAllResults(sub1,sub2);
}
else return;
},
get:function (string,sub1,sub2) {
this.results = [];
this.string = string;
this.getAllResults(sub1,sub2);
return this.results;
}
};
var str = 'this is the haystack {{{0}}} {{{1}}} {{{2}}} {{{3}}} {{{4}}} some text {{{5}}} end of haystack';
var result = getFromBetween.get(str,"{{{","}}}");
console.log(result);
// returns: [0,1,2,3,4,5]
RangeError: Maximum call stack size exceeded
exception.
var s = 'MyLongString:StringIWant;';
/:([^;]+);/.exec(s)[1]; // StringIWant
J'aime cette méthode:
var str = 'MyLongString:StringIWant;';
var tmpStr = str.match(":(.*);");
var newStr = tmpStr[1];
//newStr now contains 'StringIWant'
J'ai utilisé @tsds façon mais en utilisant uniquement la fonction de fractionnement.
var str = 'one:two;three';
str.split(':')[1].split(';')[0] // returns 'two'
avertissement: s'il n'y a pas de ":" dans la chaîne, l'accès à l'index '1' du tableau générera une erreur! str.split (':') [1]
donc @tsds way est plus sûr s'il y a incertitude
str.split(':').pop().split(';')[0]
function substringBetween(s, a, b) {
var p = s.indexOf(a) + a.length;
return s.substring(p, s.indexOf(b, p));
}
// substringBetween('MyLongString:StringIWant;', ':', ';') -> StringIWant
// substringBetween('MyLongString:StringIWant;;', ':', ';') -> StringIWant
// substringBetween('MyLongString:StringIWant;:StringIDontWant;', ':', ';') -> StringIWant
Vous pouvez utiliser une fonction d'ordre supérieur pour renvoyer une version «compilée» de votre extracteur, de cette façon c'est plus rapide.
Avec les expressions régulières, et en compilant l'expression régulière une fois dans une fermeture, la correspondance de Javascript renverra toutes les correspondances.
Cela ne nous laisse plus qu'à supprimer ce que nous avons utilisé comme marqueurs (c'est-à-dire:) {{
et nous pouvons utiliser la longueur de chaîne pour cela avec slice.
function extract([beg, end]) {
const matcher = new RegExp(`${beg}(.*?)${end}`,'gm');
const normalise = (str) => str.slice(beg.length,end.length*-1);
return function(str) {
return str.match(matcher).map(normalise);
}
}
Compilez une fois et utilisez plusieurs fois ...
const stringExtractor = extract(['{','}']);
const stuffIneed = stringExtractor('this {is} some {text} that can be {extracted} with a {reusable} function');
// Outputs: [ 'is', 'text', 'extracted', 'reusable' ]
Ou à usage unique ...
const stuffIneed = extract(['{','}'])('this {is} some {text} that can be {extracted} with a {reusable} function');
// Outputs: [ 'is', 'text', 'extracted', 'reusable' ]
Regardez également la replace
fonction de Javascript mais en utilisant une fonction pour l'argument de remplacement (vous le feriez si, par exemple, vous faisiez un mini moteur de modèle (interpolation de chaîne) ... lodash.get pourrait également être utile pour obtenir les valeurs que vous souhaitez remplacer par ? ...
Ma réponse est trop longue mais cela pourrait aider quelqu'un!
Vous pouvez également utiliser celui-ci ...
function extractText(str,delimiter){
if (str && delimiter){
var firstIndex = str.indexOf(delimiter)+1;
var lastIndex = str.lastIndexOf(delimiter);
str = str.substring(firstIndex,lastIndex);
}
return str;
}
var quotes = document.getElementById("quotes");
// " - represents quotation mark in HTML
<div>
<div>
<span id="at">
My string is @between@ the "at" sign
</span>
<button onclick="document.getElementById('at').innerText = extractText(document.getElementById('at').innerText,'@')">Click</button>
</div>
<div>
<span id="quotes">
My string is "between" quotes chars
</span>
<button onclick="document.getElementById('quotes').innerText = extractText(document.getElementById('quotes').innerText,'"')">Click</button>
</div>
</div>
Récupère une chaîne entre deux sous-chaînes (contient plus d'un caractère)
function substrInBetween(whole_str, str1, str2){
if (whole_str.indexOf(str1) === -1 || whole_str.indexOf(str2) === -1) {
return undefined; // or ""
}
strlength1 = str1.length;
return whole_str.substring(
whole_str.indexOf(str1) + strlength1,
whole_str.indexOf(str2)
);
}
Notez que j'utilise à la indexOf()
place de lastIndexOf()
donc il vérifiera les premières occurrences de ces chaînes
strlength1
variable? La valeur doit être utilisée en ligne à la place. De plus, le style de boîtier que vous utilisez n'est pas clair . strlength1
- pas de style, whole_str
- étui serpent.
Essayez ceci pour obtenir une sous-chaîne entre deux caractères en utilisant javascript.
$("button").click(function(){
var myStr = "MyLongString:StringIWant;";
var subStr = myStr.match(":(.*);");
alert(subStr[1]);
});
Tiré de @ Find sous-chaîne entre les deux caractères avec jQuery
Utilisation de jQuery :
get_between <- function(str, first_character, last_character) {
new_str = str.match(first_character + "(.*)" + last_character)[1].trim()
return(new_str)
}
chaîne
my_string = 'and the thing that ! on the @ with the ^^ goes now'
utilisation :
get_between(my_string, 'that', 'now')
résultat :
"! on the @ with the ^^ goes
Une petite fonction que j'ai créée qui peut saisir la chaîne entre et peut (éventuellement) sauter un certain nombre de mots correspondants pour saisir un index spécifique.
En outre, définir start
sur false
utilisera le début de la chaîne et définir end
sur false
utilisera la fin de la chaîne.
défini pos1
sur la position du start
texte que vous souhaitez utiliser, 1
utilisera la première occurrence destart
pos2
fait la même chose que pos1
, mais pour end
, et 1
utilisera la première occurrence de end
seulement après start
, les occurrences d' end
avant start
sont ignorées.
function getStringBetween(str, start=false, end=false, pos1=1, pos2=1){
var newPos1 = 0;
var newPos2 = str.length;
if(start){
var loops = pos1;
var i = 0;
while(loops > 0){
if(i > str.length){
break;
}else if(str[i] == start[0]){
var found = 0;
for(var p = 0; p < start.length; p++){
if(str[i+p] == start[p]){
found++;
}
}
if(found >= start.length){
newPos1 = i + start.length;
loops--;
}
}
i++;
}
}
if(end){
var loops = pos2;
var i = newPos1;
while(loops > 0){
if(i > str.length){
break;
}else if(str[i] == end[0]){
var found = 0;
for(var p = 0; p < end.length; p++){
if(str[i+p] == end[p]){
found++;
}
}
if(found >= end.length){
newPos2 = i;
loops--;
}
}
i++;
}
}
var result = '';
for(var i = newPos1; i < newPos2; i++){
result += str[i];
}
return result;
}