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 .
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:
finalStringSchrodingersQuotedString="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).
é 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.
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)}returnthis}
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:
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.
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.
Respostas:
Você pode usar
String#replaceAll()
com um padrão^\"|\"$
para isso.Por exemplo
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 .
fonte
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?^\"|\"$
.|
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.Para remover o primeiro e o último caractere da string, use:
fonte
Também com Apache
StringUtils.strip()
:Assim,
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
"partially
e"fully"
aspas).fonte
Se as aspas duplas existirem apenas no início e no final, um código simples como isso funcionaria perfeitamente:
string = string.replace("\"", "");
fonte
Esta é a melhor maneira que encontrei, para remover aspas duplas do início e do fim de uma string.
fonte
Usando o Goiaba, você pode escrever com mais elegância
CharMatcher.is('\"').trimFrom(mystring);
fonte
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.
fonte
Kotlin
No Kotlin, você pode usar String.removeSurrounding (delimitador: CharSequence)
Por exemplo
O código fonte fica assim:
fonte
removeSurrounding()
método que eu compartilhei acima me parecia fácil de entender por qualquer desenvolvedor java.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:fonte
Modificando um pouco a resposta de @ brcolow
fonte
@NonNull
e provavelmente deve ter algo comoObjects.requireNonNull(string)
dentro dele, porque se alguém está chamando stripQuotes (null), provavelmente está fazendo isso por engano!Scala
Isso funciona independentemente de a sequência ter ou não aspas no início e / ou no final.
Edit: Desculpe, somente Scala
fonte
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.
fonte
fonte
fonte
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:
Se você também precisar remover aspas simples:
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 :
fonte
encontre índices de cada aspas duplas e insira uma string vazia lá.
fonte