Como posso aparar aspas duplas no início e no final de uma string?

138

Gostaria de aparar um começo e um final entre aspas duplas (") de uma string.
Como posso conseguir isso em Java? Obrigado!

ufk
fonte
1
Já se sabe que a sequência tem aspas ou a verificação de aspas faz parte do problema?
Michael Myers

Respostas:

249

Você pode usar String#replaceAll()com um padrão ^\"|\"$para isso.

Por exemplo

string = string.replaceAll("^\"|\"$", "");

Para saber mais sobre expressões regulares, acesse http://regular-expression.info .

Dito isto, cheira um pouco assim que você está tentando inventar um analisador de CSV. Nesse caso, sugiro procurar em bibliotecas existentes, como o OpenCSV .

BalusC
fonte
6
você não acha que ele substituirá todas as ocorrências de aspas duplas por uma sequência vazia, em vez da primeira e da última.
GuruKulki 9/04
1
@ufk: Este não é um regex complexo. De contrário pode querer aborrecimento com um monte de String#indexOf(), String#substring(), métodos e assim por diante. É apenas um pouco mais rápido, mas é muito mais código. @GK: Você leu / entendeu o regex ou até o testou?
BalusC
11
@GK, o sinal de intercalação representa o início da sequência pesquisada e o cifrão representa o fim. A barra invertida aqui "escapa" a citação a seguir, por isso é tratada apenas como um caractere. Portanto, este regex diz: substitua todas as ocorrências de aspas no início ou aspas no final pela string vazia. Assim como solicitado.
precisa saber é o seguinte
2
@ Marc: Não tenho certeza de como isso é um problema, considerando a pergunta em sua forma atual.
BalusC
8
Aqui está a regex discriminados: ^\"|\"$. |significa "ou". Assim, corresponderá a ^\"ou \"$. ^corresponde ao início da string e ao $final da string. ^\"significa corresponder uma cotação no início da string e \"$corresponde a uma cotação no final da string.
Ibizaman
31

Para remover o primeiro e o último caractere da string, use:

myString = myString.substring(1, myString.length()-1);
Michael Myers
fonte
18
Isso requer apenas que as cotações estejam garantidas . Se não houver garantia, será necessário verificar antes.
BalusC
4
@BalusC: Certamente. Pela minha leitura da pergunta, parece que a string já é conhecida por ter aspas.
Michael Myers
.length é uma propriedade não uma função
Martin
2
@ Martin: .length é uma propriedade de matrizes, mas .length () é um método de Strings.
Michael Myers
@MichaelMyers: Opa, desculpe, eu estava no modo JavaScript mental. Meu erro.
Martin
16

Também com Apache StringUtils.strip():

 StringUtils.strip(null, *)          = null
 StringUtils.strip("", *)            = ""
 StringUtils.strip("abc", null)      = "abc"
 StringUtils.strip("  abc", null)    = "abc"
 StringUtils.strip("abc  ", null)    = "abc"
 StringUtils.strip(" abc ", null)    = "abc"
 StringUtils.strip("  abcyx", "xyz") = "  abc"

Assim,

final String SchrodingersQuotedString = "may or may not be quoted";
StringUtils.strip(SchrodingersQuotedString, "\""); //quoted no more

Este método funciona tanto com seqüências de caracteres entre aspas quanto entre aspas, como mostrado no meu exemplo. A única desvantagem é que ele não procurará aspas estritamente correspondentes , apenas caracteres de aspas iniciais e finais (ou seja, nenhuma distinção entre strings "partiallye "fully"aspas).

rath
fonte
13

Se as aspas duplas existirem apenas no início e no final, um código simples como isso funcionaria perfeitamente:

string = string.replace("\"", "");

sunraincyq
fonte
13

Esta é a melhor maneira que encontrei, para remover aspas duplas do início e do fim de uma string.

someString.replace (/(^")|("$)/g, '')
Yaniv Levi
fonte
2
Talvez incluir aspas simples também substitua (/ (^ \ "| \ ') | (\" | \' $) / g, "");
bob
11

Usando o Goiaba, você pode escrever com mais elegância CharMatcher.is('\"').trimFrom(mystring);

legrass
fonte
2
é possível cortar apenas um caractere? Por exemplo, se minha string terminar com duas aspas simples, ainda quero que apenas aspas simples sejam cortadas.
você precisa saber é o seguinte
10

Primeiro, verificamos se a String é duplicada entre aspas e, em caso afirmativo, removemos. Você pode pular o condicional se, de fato, souber que ele é citado duas vezes.

if (string.length() >= 2 && string.charAt(0) == '"' && string.charAt(string.length() - 1) == '"')
{
    string = string.substring(1, string.length() - 1);
}
brcolow
fonte
Essa é a resposta de maior desempenho por ordens de magnitude e até especifica o que fazer com relação à presença opcional ou não das aspas.
entonio 25/09
6

Kotlin

No Kotlin, você pode usar String.removeSurrounding (delimitador: CharSequence)

Por exemplo

string.removeSurrounding("\"")

Remove a cadeia de caracteres delimitadora fornecida do início e do fim dessa cadeia de caracteres, se e somente se ela inicia e termina com o delimitador . Caso contrário, retorna essa sequência inalterada.

O código fonte fica assim:

public fun String.removeSurrounding(delimiter: CharSequence): String = removeSurrounding(delimiter, delimiter)

public fun String.removeSurrounding(prefix: CharSequence, suffix: CharSequence): String {
    if ((length >= prefix.length + suffix.length) && startsWith(prefix) && endsWith(suffix)) {
        return substring(prefix.length, length - suffix.length)
    }
    return this
}
Ryan Amaral
fonte
Existem centenas de outras linguagens de programação. Por que você forneceu a resposta para Kotlin e não para os outros :-)?
nickolay.laptev
1
Boa pergunta @ nickolay.laptev! :) Eu costumava escrever java e mudei para o kotlin e, como sou um desenvolvedor de Android, pensei que talvez houvesse outros desenvolvedores na mesma posição, então isso poderia ser útil para eles também. Além disso, o removeSurrounding()método que eu compartilhei acima me parecia fácil de entender por qualquer desenvolvedor java.
Ryan Amaral
1
Esta resposta única ilustra todo o ponto de adotar o Kotlin na sua base de código Java existente!
Kirill Groshkov 05/04
3

O padrão abaixo, quando usado com java.util.regex.Matcher, corresponderá a qualquer sequência entre aspas duplas, sem afetar as ocorrências de aspas duplas dentro da sequência:

"[^\"][\\p{Print}]*[^\"]"
Alex F
fonte
2

Modificando um pouco a resposta de @ brcolow

if (string != null && string.length() >= 2 && string.startsWith("\"") && string.endsWith("\"") {
    string = string.substring(1, string.length() - 1);
}
Confuso
fonte
Eu acho que o argumento do método deve ser anotado @NonNulle provavelmente deve ter algo como Objects.requireNonNull(string)dentro dele, porque se alguém está chamando stripQuotes (null), provavelmente está fazendo isso por engano!
brcolow
2

Scala

s.stripPrefix("\"").stripSuffix("\"")

Isso funciona independentemente de a sequência ter ou não aspas no início e / ou no final.

Edit: Desculpe, somente Scala

Brendan Maguire
fonte
2

Editado: Acabei de perceber que devo especificar que isso funciona apenas se os dois existirem. Caso contrário, a sequência não será considerada entre aspas. Esse cenário apareceu para mim ao trabalhar com arquivos CSV.

org.apache.commons.lang3.StringUtils.unwrap("\"abc\"", "\"")    = "abc"
org.apache.commons.lang3.StringUtils.unwrap("\"abc", "\"")    = "\"abc"
org.apache.commons.lang3.StringUtils.unwrap("abc\"", "\"")    = "abc\""
raisercostin
fonte
1
Matcher m = Pattern.compile("^\"(.*)\"$").matcher(value);
String strUnquoted = value;
if (m.find()) {
    strUnquoted = m.group(1);
}
Ravikiran
fonte
1
private static String removeQuotesFromStartAndEndOfString(String inputStr) {
    String result = inputStr;
    int firstQuote = inputStr.indexOf('\"');
    int lastQuote = result.lastIndexOf('\"');
    int strLength = inputStr.length();
    if (firstQuote == 0 && lastQuote == strLength - 1) {
        result = result.substring(1, strLength - 1);
    }
    return result;
}
m0untp
fonte
1

Para remover uma ou mais aspas duplas do início e do fim de uma string em Java, você precisa usar uma solução baseada em regex:

String result = input_str.replaceAll("^\"+|\"+$", "");

Se você também precisar remover aspas simples:

String result = input_str.replaceAll("^[\"']+|[\"']+$", "");

NOTA : Se a sua string contiver "dentro, essa abordagem poderá gerar problemas (por exemplo, "Name": "John"=> Name": "John).

Veja uma demonstração do Java aqui :

String input_str = "\"'some string'\"";
String result = input_str.replaceAll("^[\"']+|[\"']+$", "");
System.out.println(result); // => some string
Wiktor Stribiżew
fonte
0

encontre índices de cada aspas duplas e insira uma string vazia lá.

GuruKulki
fonte
portanto, deve ser o primeiro índice e o último índice de qoute duplo.
GuruKulki 9/04