Assumindo:
var someStr = 'He said "Hello, my name is Foo"';
console.log(someStr.replace(/['"]+/g, ''));
Isso deve funcionar ... (se seu objetivo é substituir todas as aspas duplas).
Veja como funciona:
['"]
é uma classe de caracteres, corresponde a aspas simples e duplas. você pode substituí-lo por "
para corresponder apenas aspas duplas.
+
: uma ou mais cotações, caracteres, conforme definido pela classe de caracteres anterior (opcional)
g
: a bandeira global . Isso diz ao JS para aplicar o regex a toda a cadeia. Se você omitir isso, substituirá apenas um único caractere.
Se você estiver tentando remover as aspas em torno de uma determinada string (ou seja, em pares), as coisas ficam um pouco mais complicadas. Você precisará usar asserções de aparência:
var str = 'remove "foo" delimiting double quotes';
console.log(str.replace(/"([^"]+(?="))"/g, '$1'));
//logs remove foo delimiting quotes
str = 'remove only "foo" delimiting "';//note trailing " at the end
console.log(str.replace(/"([^"]+(?="))"/g, '$1'));
//logs remove only foo delimiting "<-- trailing double quote is not removed
Regex explicou:
"
: literal, corresponde a qualquer literal "
(
: começa a capturar o grupo. O que estiver entre parênteses ( ()
) será capturado e poderá ser usado no valor de substituição.
[^"]+
: Classe de personagem, corresponde a todos os caracteres, exceto "
1 ou mais vezes
(?=")
: asserção de aparência positiva à largura zero (como não capturada). A partida anterior só será válida se for seguida por um "
literal
)
: final do grupo de captura, capturamos tudo entre o fechamento de abertura "
"
: outro literal, item de lista cf, um
A substituição é que '$1'
esta é uma referência anterior ao primeiro grupo capturado, sendo [^" ]+
ou tudo entre aspas duplas. O padrão corresponde às aspas e ao que há entre elas, mas o substitui apenas pelo que está entre as aspas, removendo-as efetivamente.
O que ele faz é some "string with" quotes
-> substitui "string with"
por -> string with
. Cotações desaparecidas, trabalho feito.
Se as aspas sempre estiverem no início e no final da string, você poderá usar o seguinte:
str.replace(/^"(.+(?="$))"$/, '$1');
Com a entrada remove "foo" delimiting "
, a saída permanecerá inalterada, mas altere a sequência de entrada para "remove "foo" delimiting quotes"
e você terminará remove "foo" delimiting quotes
como saída.
Explicação:
^"
: corresponde ao início da string ^
e a "
. Se a sequência não começar com a "
, a expressão já falhará aqui e nada será substituído.
(.+(?="$))
: corresponde (e captura) tudo, incluindo aspas duplas uma ou mais vezes, desde que a aparência positiva seja verdadeira
(?="$)
: o lookahead positivo é o mesmo que acima, apenas especifica que "
deve ser o fim da string ( $
=== end)
"$
: corresponde à citação final, mas não a captura
A substituição é feita da mesma maneira que antes: substituímos a partida (que inclui as aspas de abertura e fechamento) por tudo o que estava dentro delas.
Você deve ter notado que omiti a g
flag (para BTW global), porque, como estamos processando toda a string, essa expressão se aplica apenas uma vez.
Um regex mais fácil que faça praticamente a mesma coisa (há diferença interna de como o regex é compilado / aplicado) seria:
someStr.replace(/^"(.+)"$/,'$1');
Como antes ^"
e "$
combinar as citações de delimitação no início e no final de uma corda, ea (.+)
partidas tudo mais, e captura-o. Eu tentei esse regex, ao lado do descrito acima (com afirmação lookahead) e, para minha surpresa, achei que este era um pouco mais lento. Meu palpite seria que a asserção de lookaround faz com que a expressão anterior falhe assim que o mecanismo determinar que não existe "
no final da string. Ah, bem, mas se é isso que você deseja / precisa, continue lendo :
No entanto, neste último caso, é muito mais seguro, mais rápido, mais sustentável e apenas melhor para fazer isso:
if (str.charAt(0) === '"' && str.charAt(str.length -1) === '"')
{
console.log(str.substr(1,str.length -2));
}
Aqui, estou verificando se o primeiro e o último caractere da string são aspas duplas. Se estiverem, estou usando substr
para cortar os primeiro e o último caracteres. As cadeias são indexadas a zero, portanto, o último caractere é o charAt(str.length -1)
. substr
espera 2 argumentos, onde o primeiro é o deslocamento a partir do qual a substring inicia, o segundo é o seu comprimento. Como não queremos o último caractere, mais do que queremos o primeiro, esse comprimento é str.length - 2
. Fácil-peazy.
Dicas :
Mais informações sobre asserções detalhadas podem ser encontradas aqui. As
Regex são muito úteis (e divertidas para a IMO), podem ser um pouco desconcertantes a princípio. Aqui estão mais alguns detalhes e links para recursos sobre o assunto.
Se você ainda não está confortável com o uso de regex, considere usar:
var noQuotes = someStr.split('"').join('');
Se houver muitas aspas na string, isso pode ser mais rápido do que usar regex