Respostas:
Você pode tentar isso
var mySubString = str.substring(
str.lastIndexOf(":") + 1,
str.lastIndexOf(";")
);
Você também pode tentar isso:
var str = 'one:two;three';
str.split(':').pop().split(';')[0]; // returns 'two'
str.split(':').pop().split(';')[0]
pode ser mais rápido do que usar.shift()
Usar split()
var s = 'MyLongString:StringIWant;';
var arrStr = s.split(/[:;]/);
alert(arrStr);
arrStr
conterá toda a string delimitada por :
ou ;
então acesse todas as strings atravésfor-loop
for(var i=0; i<arrStr.length; i++)
alert(arrStr[i]);
\[(.*?)\]
---> Em resumo, você precisa escapar entre colchetes, pois [] indica a classe de caracteres no regex.
@Babasaheb Gosavi A resposta é perfeita se você tiver uma ocorrência das substrings (":" e ";"). mas uma vez que você tenha várias ocorrências, pode ser um pouco complicado.
A melhor solução que encontrei para trabalhar em vários projetos é usar quatro métodos dentro de um objeto.
Então chega de conversa, vamos ver o código:
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
exceção.
var s = 'MyLongString:StringIWant;';
/:([^;]+);/.exec(s)[1]; // StringIWant
Eu gosto deste método:
var str = 'MyLongString:StringIWant;';
var tmpStr = str.match(":(.*);");
var newStr = tmpStr[1];
//newStr now contains 'StringIWant'
Eu usei @tsds way, mas usando apenas a função split.
var str = 'one:two;three';
str.split(':')[1].split(';')[0] // returns 'two'
palavra de cautela: se não houver ":" na cadeia de caracteres que acessa o índice '1' da matriz, ocorrerá um erro! str.split (':') [1]
portanto, @tsds way é mais seguro se houver incerteza
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
Você pode usar uma função de ordem superior para retornar uma versão 'compilada' do seu extrator, para que seja mais rápido.
Com regexes e compilando o regex uma vez em um fechamento, a correspondência do Javascript retornará todas as correspondências.
Isso nos deixa tendo apenas que remover o que usamos como nossos marcadores (ou seja:) {{
e podemos usar o comprimento da string para isso com fatia.
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);
}
}
Compile uma vez e use várias vezes ...
const stringExtractor = extract(['{','}']);
const stuffIneed = stringExtractor('this {is} some {text} that can be {extracted} with a {reusable} function');
// Outputs: [ 'is', 'text', 'extracted', 'reusable' ]
Ou uso único ...
const stuffIneed = extract(['{','}'])('this {is} some {text} that can be {extracted} with a {reusable} function');
// Outputs: [ 'is', 'text', 'extracted', 'reusable' ]
replace
Observe também a função Javascript, mas usando uma função para o argumento de substituição (você faria isso, por exemplo, se estivesse usando um mini mecanismo de modelo (interpolação de strings) ... lodash.get também poderia ser útil para obter os valores desejados substituir com ? ...
Minha resposta é muito longa, mas pode ajudar alguém!
Você também pode usar este ...
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>
obter string entre para substrings (contém mais de 1 caractere)
function substrInBetween(whole_str, str1, str2){
strlength1 = str1.length;
return whole_str.substring(
whole_str.indexOf(str1) + strlength1,
whole_str.indexOf(str2)
);
}
Note que eu uso em indexOf()
vez de, lastIndexOf()
portanto, ele verificará as primeiras ocorrências dessas strings
strlength1
variável? O valor deve ser usado em linha. Também não está claro qual estilo de caso você está usando. strlength1
- sem estilo, whole_str
- estojo de cobra.
Tente fazer isso para obter substring entre dois caracteres usando javascript.
$("button").click(function(){
var myStr = "MyLongString:StringIWant;";
var subStr = myStr.match(":(.*);");
alert(subStr[1]);
});
Retirado de @ Localizar substring entre os dois caracteres com jQuery
Usando 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'
uso :
get_between(my_string, 'that', 'now')
resultado :
"! on the @ with the ^^ goes
Uma pequena função que eu criei que pode pegar a string entre, e pode (opcionalmente) pular várias palavras correspondentes para pegar um índice específico.
Além disso, definir start
para false
usará o início da sequência e definir end
comofalse
usará o final da string.
definido pos1
na posição do start
texto que você deseja usar, 1
usará a primeira ocorrência destart
pos2
faz a mesma coisa que pos1
, mas para end
, e 1
usará a primeira ocorrência de end
somente depois start
, as ocorrências de end
antes start
são ignoradas.
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;
}