Risposte:
Puoi provare questo
var mySubString = str.substring(
str.lastIndexOf(":") + 1,
str.lastIndexOf(";")
);
Puoi anche provare questo:
var str = 'one:two;three';
str.split(':').pop().split(';')[0]; // returns 'two'
str.split(':').pop().split(';')[0]
potrebbe essere più veloce dell'uso.shift()
Uso split()
var s = 'MyLongString:StringIWant;';
var arrStr = s.split(/[:;]/);
alert(arrStr);
arrStr
conterrà tutte le stringhe delimitate da :
o ;
quindi accedi ad ogni stringa attraversofor-loop
for(var i=0; i<arrStr.length; i++)
alert(arrStr[i]);
\[(.*?)\]
---> In breve, devi sfuggire alle parentesi quadre, poiché [] indica la classe di caratteri in regex.
@Babasaheb Gosavi La risposta è perfetta se si verifica un'occorrenza delle sottostringhe (":" e ";"). ma una volta che hai più ricorrenze, potrebbe diventare un po 'complicato.
La migliore soluzione che mi è venuta in mente per lavorare su più progetti è usare quattro metodi all'interno di un oggetto.
Quindi, parlando abbastanza, vediamo il codice:
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
un'eccezione.
var s = 'MyLongString:StringIWant;';
/:([^;]+);/.exec(s)[1]; // StringIWant
Mi piace questo metodo:
var str = 'MyLongString:StringIWant;';
var tmpStr = str.match(":(.*);");
var newStr = tmpStr[1];
//newStr now contains 'StringIWant'
Ho usato il modo @tsds ma usando solo la funzione split.
var str = 'one:two;three';
str.split(':')[1].split(';')[0] // returns 'two'
avvertenza: se non ci sono ":" nella stringa che accede all'indice '1' dell'array genererà un errore! str.split ( ':') [1]
quindi il modo @tsds è più sicuro se c'è incertezza
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
Puoi utilizzare una funzione di ordine superiore per restituire una versione "compilata" del tuo estrattore, in questo modo è più veloce.
Con regex e compilando il regex una volta chiuso, la partita di Javascript restituirà tutte le partite.
Questo ci lascia solo dover rimuovere ciò che abbiamo usato come marcatori (cioè:) {{
e possiamo usare la lunghezza della stringa per questo con 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);
}
}
Compila una volta e usa più volte ...
const stringExtractor = extract(['{','}']);
const stuffIneed = stringExtractor('this {is} some {text} that can be {extracted} with a {reusable} function');
// Outputs: [ 'is', 'text', 'extracted', 'reusable' ]
O uso singolo ...
const stuffIneed = extract(['{','}'])('this {is} some {text} that can be {extracted} with a {reusable} function');
// Outputs: [ 'is', 'text', 'extracted', 'reusable' ]
Guarda anche la replace
funzione di Javascript ma usando una funzione per l'argomento di sostituzione (Lo faresti se, ad esempio, facessi un motore mini template (interpolazione di stringhe) ... lodash.get potrebbe anche essere utile per ottenere i valori che desideri sostituirlo con ? ...
La mia risposta è troppo lunga ma potrebbe aiutare qualcuno!
Puoi anche usare questo ...
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>
Ottieni una stringa tra due sottostringhe (contiene più di 1 carattere)
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)
);
}
Nota che uso indexOf()
invece di lastIndexOf()
così controllerà le prime occorrenze di quelle stringhe
strlength1
variabile? Il valore dovrebbe essere usato invece in linea. Inoltre, non è chiaro quale stile di caso si sta utilizzando. strlength1
- nessuno stile, whole_str
- custodia per serpenti.
Prova questo per ottenere Sottostringa tra due caratteri usando JavaScript.
$("button").click(function(){
var myStr = "MyLongString:StringIWant;";
var subStr = myStr.match(":(.*);");
alert(subStr[1]);
});
Tratto da @ Trova sottostringa tra i due personaggi con jQuery
Utilizzando jQuery :
get_between <- function(str, first_character, last_character) {
new_str = str.match(first_character + "(.*)" + last_character)[1].trim()
return(new_str)
}
corda
my_string = 'and the thing that ! on the @ with the ^^ goes now'
utilizzo :
get_between(my_string, 'that', 'now')
risultato :
"! on the @ with the ^^ goes
Una piccola funzione che ho fatto che può afferrare la stringa tra, e può (facoltativamente) saltare un numero di parole abbinate per afferrare un indice specifico.
Inoltre, l'impostazione start
su false
utilizzerà l'inizio della stringa e l'impostazione end
to false
utilizzerà la fine della stringa.
impostato pos1
sulla posizione del start
testo che si desidera utilizzare, 1
utilizzerà la prima occorrenza distart
pos2
fa la stessa cosa di pos1
, ma per end
, e 1
utilizzerà la prima occorrenza di end
solo dopo start
, le occorrenze di end
prima start
vengono ignorate.
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;
}