¿Cómo puedo recortar comillas dobles iniciales y finales de una cadena?

139

Me gustaría recortar una comilla doble inicial y final (") de una cadena.
¿Cómo puedo lograr eso en Java? ¡Gracias!

ufk
fuente
1
¿Ya se sabe que la cadena tiene comillas o es la búsqueda de comillas parte del problema?
Michael Myers

Respuestas:

250

Puede usar String#replaceAll()con un patrón de ^\"|\"$para esto.

P.ej

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

Para obtener más información sobre las expresiones regulares, consulte también http://regular-expression.info .

Dicho esto, esto huele un poco a que estás tratando de inventar un analizador CSV. Si es así, sugeriría buscar bibliotecas existentes, como OpenCSV .

BalusC
fuente
66
¿No crees que reemplazará todas las apariciones de comillas dobles con una cadena vacía en lugar de la primera y la última.
GuruKulki
1
@ufk: Esta no es una expresión regular compleja. De lo contrario, puede que desee sin problemas con un montón de String#indexOf(), String#substring(), métodos y así sucesivamente. Es solo un poco más rápido, pero es mucho más código. @ GK: Uh, ¿leíste / entendiste la expresión regular o incluso la probaste?
BalusC
11
@GK el cursor representa el comienzo de la cadena buscada y el signo de dólar representa su final. La barra invertida aquí "escapa" a la siguiente cita, por lo que se trata solo como un personaje. Entonces, esta expresión regular dice, reemplace todas las apariciones de comillas al comienzo, o comillas al final, con la cadena vacía. Tal como lo solicitó.
Carl Manaster
2
@Marc: No estoy seguro de cómo es un problema teniendo en cuenta la pregunta en su forma actual.
BalusC
8
Aquí es la expresión regular desglosado: ^\"|\"$. |significa "o". Por lo tanto, coincidirá con ^\"o \"$. ^coincide con el inicio de la cadena y $coincide con el final de la cadena. ^\"significa hacer coincidir una cita al comienzo de la cadena y hacer \"$coincidir una cita al final de la cadena.
ibizaman el
31

Para eliminar el primer carácter y el último carácter de la cadena, use:

myString = myString.substring(1, myString.length()-1);
Michael Myers
fuente
18
Esto solo requiere que las cotizaciones estén garantizadas . Si no hay garantía, primero deberá verificarlo de antemano.
BalusC
44
@BalusC: Ciertamente. De mi lectura de la pregunta, parece que ya se sabe que la cadena tiene comillas alrededor.
Michael Myers
.length es una propiedad, no una función
Martin
2
@ Martin: .length es una propiedad de las matrices, pero .length () es un método de cadenas.
Michael Myers
@MichaelMyers: Vaya, lo siento, estaba en modo JavaScript mental. Mi error.
Martin
16

También con 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"

Entonces,

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

Este método funciona tanto con cadenas entre comillas como sin comillas, como se muestra en mi ejemplo. El único inconveniente es que no buscará estrictamente coincidentes cotizaciones, sólo el ataque y de salida comillas (es decir. No distingue entre "partiallyy "fully"cadenas entre comillas).

rath
fuente
13

Si las comillas dobles solo existen al principio y al final, un código simple como este funcionaría perfectamente:

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

sunraincyq
fuente
13

Esta es la mejor manera que encontré, para quitar comillas dobles desde el principio y el final de una cadena.

someString.replace (/(^")|("$)/g, '')
Yaniv Levi
fuente
2
Quizás incluir comillas simples también reemplazar (/ (^ \ "| \ ') | (\" | \' $) / g, "");
bob
11

Usando guayaba puedes escribir más elegantemente CharMatcher.is('\"').trimFrom(mystring);

legrass
fuente
2
¿Es posible recortar solo un carácter? Por ejemplo, si mi cadena termina con dos comillas simples, solo quiero recortarlas.
vatsal mevada
10

Primero, verificamos si la Cadena se duplica entre comillas, y si es así, las eliminamos. Puede omitir el condicional si, de hecho, sabe que está entre comillas dobles.

if (string.length() >= 2 && string.charAt(0) == '"' && string.charAt(string.length() - 1) == '"')
{
    string = string.substring(1, string.length() - 1);
}
brcolow
fuente
Esta es la respuesta más eficaz por orden de magnitud e incluso especifica qué hacer con respecto a la presencia opcional o no de las comillas.
entonio
6

Kotlin

En Kotlin puedes usar String.removeSurrounding (delimitador: CharSequence)

P.ej

string.removeSurrounding("\"")

Elimina la cadena de delimitador dada tanto desde el inicio como hasta el final de esta cadena si y solo si comienza y termina con el delimitador . De lo contrario, devuelve esta cadena sin cambios.

El código fuente se ve así:

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
fuente
Hay cientos de otros lenguajes de programación. ¿Por qué proporcionó la respuesta para Kotlin y no para otros :-)?
nickolay.laptev
1
Buena pregunta @ nickolay.laptev! :) Solía ​​escribir java y me mudé a kotlin y, como soy desarrollador de Android, pensé que podría tener otros desarrolladores en la misma posición, por lo que esto también podría ser útil para ellos. Además, removeSurrounding()me pareció que el método que compartí anteriormente podría ser fácilmente comprensible por cualquier desarrollador de Java.
Ryan Amaral
1
¡Esta única respuesta ilustra todo el punto de adoptar Kotlin en su base de código Java existente!
Kirill Groshkov
3

El siguiente patrón, cuando se usa con java.util.regex.Matcher, coincidirá con cualquier cadena entre comillas dobles sin afectar la aparición de comillas dobles dentro de la cadena:

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

Modificando un poco la respuesta de @ brcolow

if (string != null && string.length() >= 2 && string.startsWith("\"") && string.endsWith("\"") {
    string = string.substring(1, string.length() - 1);
}
Confuso
fuente
¡Pensaría que el argumento del método debería estar anotado @NonNully probablemente debería tener algo así Objects.requireNonNull(string)dentro de él porque si alguien llama stripQuotes (nulo), probablemente lo esté haciendo por error!
brcolow
2

Scala

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

Esto funciona independientemente de si la cadena tiene o no comillas al principio y / o al final.

Editar: Lo siento, solo Scala

Brendan Maguire
fuente
2

Editado: Acabo de darme cuenta de que debo especificar que esto funciona solo si ambos existen. De lo contrario, la cadena no se considera entre comillas. Tal escenario apareció para mí cuando trabajaba con archivos 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
fuente
1
Matcher m = Pattern.compile("^\"(.*)\"$").matcher(value);
String strUnquoted = value;
if (m.find()) {
    strUnquoted = m.group(1);
}
Ravikiran
fuente
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
fuente
1

Para eliminar una o más comillas dobles del inicio y el final de una cadena en Java, debe usar una solución basada en expresiones regulares:

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

Si necesita eliminar también comillas simples:

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

NOTA : Si su cadena contiene "adentro, este enfoque puede generar problemas (por ejemplo, "Name": "John"=>Name": "John ).

Vea una demostración de Java aquí :

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

encuentre índices de cada comilla doble e inserte una cadena vacía allí.

GuruKulki
fuente
por lo tanto, debe ser el primer índice y el último índice de doble qoute.
GuruKulki