string dividida somente na primeira instância do caractere especificado

No meu código eu dividi uma string baseada em _ e peguei o segundo item na matriz.

 var element = $(this).attr('class'); var field = element.split('_')[1]; 

Leva good_luck e me dá luck . Funciona bem!

Mas agora eu tenho uma turma que se parece com good_luck_buddy . Como obtenho o meu javascript para ignorar o segundo _ e me dar luck_buddy ?

Eu encontrei este var field = element.split(new char [] {'_'}, 2); em resposta # stackoverflow ac # mas não funciona. Eu tentei no jsFiddle …

Use parênteses de captura :

 "good_luck_buddy".split(/_(.+)/)[1] "luck_buddy" 

Eles são definidos como

Se o separator contiver parênteses de captura, os resultados correspondentes serão retornados na matriz.

Portanto, neste caso, queremos dividir em _.+ (Ou seja, o separador de divisão é uma subcadeia começando por _ ), mas também permite que o resultado contenha alguma parte do nosso separador (isto é, tudo após _ ).

Neste exemplo, nosso separador (correspondência de _(.+) ) É _luck_buddy e o grupo capturado (dentro do separador) é lucky_buddy . Sem o parêntese de captura, o luck_buddy (correspondência .+ ) Não teria sido incluído na matriz resultante, pois é o caso da split simples que os separadores não são incluídos no resultado.

O que você precisa para expressões regulares e matrizes?

 myString = myString.substring(myString.indexOf('_')+1) 
 var myString= "hello_there_how_are_you" myString = myString.substring(myString.indexOf('_')+1) console.log(myString) 

Eu evito o RegExp a todo custo. Aqui está outra coisa que você pode fazer:

 "good_luck_buddy".split('_').slice(1).join('_') 

Substitua a primeira instância por um espaço reservado exclusivo e divida a partir daí.

 "good_luck_buddy".replace(/\_/,'&').split('&') ["good","luck_buddy"] 

Isso é mais útil quando os dois lados da divisão são necessários.

Você pode usar a expressão regular como:

 var arr = element.split(/_(.*)/) 

Você pode usar o segundo parâmetro que especifica o limite da divisão. ie: var field = element.split (‘_’, 1) [1];

O JavaScript’s String.split infelizmente não tem como limitar o número real de divisões. Ele tem um segundo argumento que especifica quantos dos itens de divisão reais são retornados, o que não é útil no seu caso. A solução seria dividir a string, deslocar o primeiro item e depois juntar os itens restantes ::

 var element = $(this).attr('class'); var parts = element.split('_'); parts.shift(); // removes the first item from the array var field = parts.join('_'); 

A solução de Mark F é incrível, mas não é suportada por navegadores antigos. A solução da Kennebec é incrível e suportada por navegadores antigos, mas não suporta regex.

Então, se você está procurando uma solução que divide sua string apenas uma vez, que é suportada por navegadores antigos e suporta regex, aqui está minha solução:

 String.prototype.splitOnce = function(regex) { var match = this.match(regex); if(match) { var match_i = this.indexOf(match[0]); return [this.substring(0, match_i), this.substring(match_i + match[0].length)]; } else { return [this, ""]; } } var str = "something/////another thing///again"; alert(str.splitOnce(/\/+/)[1]); 

Para iniciantes como eu, que não estão acostumados com a Expressão Regular, essa solução alternativa funcionou:

  var field = "Good_Luck_Buddy"; var newString = field.slice( field.indexOf("_")+1 ); 

O método slice () extrai uma parte de uma string e retorna uma nova string e o método indexOf () retorna a posição da primeira ocorrência encontrada de um valor especificado em uma string.

Isso funcionou para mim no Chrome + FF:

 "foo=bar=beer".split(/^[^=]+=/)[1] // "bar=beer" "foo==".split(/^[^=]+=/)[1] // "=" "foo=".split(/^[^=]+=/)[1] // "" "foo".split(/^[^=]+=/)[1] // undefined 

Se você também precisa da chave, tente isto:

 "foo=bar=beer".split(/^([^=]+)=/) // Array [ "", "foo", "bar=beer" ] "foo==".split(/^([^=]+)=/) // [ "", "foo", "=" ] "foo=".split(/^([^=]+)=/) // [ "", "foo", "" ] "foo".split(/^([^=]+)=/) // [ "foo" ] //[0] = ignored (holds the string when there's no =, empty otherwise) //[1] = hold the key (if any) //[2] = hold the value (if any) 

Eu preciso das duas partes da string, então, regex lookbehind me ajuda com isso.

 const full_name = 'Maria do Bairro'; const [first_name, last_name] = full_name.split(/(?<=^[^ ]+) /); console.log(first_name); console.log(last_name); 

Use o método string replace() com um regex :

 document.body.innerHTML = "good_luck_buddy".replace(/.*?_/, "");