No meu código, divido uma string com base _
e pego o segundo item na matriz.
var element = $(this).attr('class');
var field = element.split('_')[1];
Pega good_luck
e me fornece luck
. Funciona bem!
Mas agora tenho uma classe que se parece good_luck_buddy
. Como obtenho meu javascript para ignorar o segundo _
e me fornecer luck_buddy
?
Encontrei isso var field = element.split(new char [] {'_'}, 2);
na resposta ac # stackoverflow, mas não funciona. Eu tentei no jsFiddle ...
fonte
_
é correspondido dentro de um grupo de captura e adicionado à lista de tokens por esse motivo."Aspect Ratio: 16:9".split(/:(.+)/)
a:["Aspect Ratio", " 16:9", ""]
": 16:9"
, não existe nada após o separador, criando assim a sequência vazia no final.Para que você precisa de expressões regulares e matrizes?
fonte
_
escrevendo:myString.substring( myString.indexOf('_', myString().indexOf('_') + 1) + 1 )
var str = "good_luck_buddy", res = str.split(/_(.+)/);
você obtém todas as partes:console.log(res[0]); console.log(res[1]);
[ string.substring(0, string.indexOf(options.divider)), string.substring(string.indexOf(options.divider) + 1) ]
Aí está. Também com suporte de agulha variávelEvito o RegExp a todo custo. Aqui está outra coisa que você pode fazer:
fonte
Substitua a primeira instância por um espaço reservado exclusivo e divida a partir daí.
Isso é mais útil quando os dois lados da divisão são necessários.
fonte
Você pode usar a expressão regular como:
Você pode usar o segundo parâmetro que especifica o limite da divisão. ou seja: campo var = elemento.split ('_', 1) [1];fonte
'good_luck_buddy'.split('_', 1);
retorna apenas['good']
(:?.*)
para ser um grupo que não capturava? Se assim for, deve ser(?:.*)
, mas se você corrigi-lo, verá que não funciona mais.(:?.*)
corresponde a um opcional:
seguido por zero ou mais de qualquer caractere. Essa solução acaba funcionando pelo mesmo motivo que o @ MarkF's: tudo após o primeiro_
é adicionado à lista de tokens porque foi correspondido em um grupo de captura. (Além disso, og
modificador não tem efeito quando usado em um regex divisão.)Esta solução funcionou para mim
OU
fonte
Atualmente
String.prototype.split
, de fato, você limita o número de divisões.embargo
Pode não funcionar da maneira que você espera. Eu esperava que isso ignorasse o restante dos delimitadores, mas, quando atinge o limite, divide a sequência restante novamente, omitindo a parte após a divisão dos resultados de retorno.
Eu estava esperando por:
fonte
String.split
Infelizmente, o Javascript não tem como limitar o número real de divisões. Ele tem um segundo argumento que especifica quantos itens de divisão reais são retornados, o que não é útil no seu caso. A solução seria dividir a string, desativar o primeiro item e juntar os itens restantes:fonte
Eu preciso das duas partes da string, então, regex lookbehind me ajudará com isso.
fonte
Com a ajuda da atribuição de desestruturação, pode ser mais legível:
fonte
Solução mais rápida?
Fiz alguns benchmarks e esta solução ganhou imensamente: 1
Comparação de desempenho com outras soluções
O único candidato próximo era a mesma linha de código, exceto usando em
substr
vez deslice
.Outras soluções que tentei envolver
split
ouRegExp
tiveram um grande impacto no desempenho e foram cerca de 2 ordens de magnitude mais lentas. Usarjoin
os resultados desplit
, obviamente, adiciona uma penalidade de desempenho adicional.Por que eles são mais lentos? Sempre que um novo objeto ou matriz tiver que ser criado, o JS precisará solicitar um pedaço de memória do sistema operacional. Este processo é muito lento.
Aqui estão algumas diretrizes gerais, caso você esteja buscando benchmarks:
{}
ou matrizes[]
(como a quesplit
cria) custarão muito em desempenho.RegExp
as pesquisas são mais complicadas e, portanto, mais lentas que as pesquisas de string.Removendo além da primeira instância
Aqui está uma solução que dividirá até a nésima instância. Não é tão rápido, mas, na questão do OP,
gobble(element, '_', 1)
ainda é> duas vezes mais rápido que uma soluçãoRegExp
ousplit
e pode fazer mais:Com a definição acima,
gobble('path/to/file.txt', '/')
daria o nome do arquivo egobble('prefix_category_item', '_', 1)
removeria o prefixo como a primeira solução nesta resposta.fonte
A solução do Mark F é incrível, mas não é suportada por navegadores antigos. A solução do Kennebec é incrível e é suportada por navegadores antigos, mas não suporta regex.
Portanto, se você estiver procurando uma solução que divida sua string apenas uma vez, suportada por navegadores antigos e que suporte regex, aqui está a minha solução:
fonte
Para iniciantes como eu, que não estão acostumados à Expressão Regular, esta solução alternativa funcionou:
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.
fonte
Use o
replace()
método string com um regex :Essa regex corresponde a 0 ou mais caracteres antes do primeiro
_
e o_
próprio. A partida é substituída por uma sequência vazia.fonte
document.body.innerHTML
parte aqui é completamente inútil.document.body.innerHTML
?document.body
depende do DOM estar presente e não funcionará em um ambiente JavaScript puro.console.log
é suficiente para esse fim ou simplesmente deixa o resultado em uma variável para inspeção.Isso funcionou para mim no Chrome + FF:
Se você também precisar da chave, tente o seguinte:
fonte
Aqui está um RegExp que faz o truque.
Primeiro força a partida a começar do início com o '^'. Em seguida, ele corresponde a qualquer número de caracteres que não sejam '_', ou seja, todos os caracteres antes do primeiro '_'.
O '?' significa que um número mínimo de caracteres que fazem com que todo o padrão corresponda é correspondido pelo '. *?' porque é seguido por '_', que é incluído na partida como seu último caractere.
Portanto, este split () usa uma peça correspondente como seu 'divisor' e a remove dos resultados. Por isso, remove tudo até e incluindo o primeiro '_' e fornece o restante como o segundo elemento do resultado. O primeiro elemento é "" representando a peça antes da peça correspondente. É "" porque a partida começa do começo.
Existem outros RegExps que funcionam tão bem como /_(.*)/ fornecidos por Chandu em uma resposta anterior.
O /^.*?_/ tem o benefício de que você pode entender o que ele faz sem precisar saber sobre o papel especial que os grupos de captura desempenham com replace ().
fonte