Comment puis-je supprimer les guillemets doubles de début et de fin d'une chaîne?

139

Je voudrais couper un guillemet double de début et de fin (") dans une chaîne.
Comment puis-je y parvenir en Java? Merci!

ufk
la source
1
La chaîne est-elle déjà connue pour être entourée de guillemets ou la vérification des guillemets fait-elle partie du problème?
Michael Myers

Réponses:

250

Vous pouvez utiliser String#replaceAll()avec un modèle de ^\"|\"$pour cela.

Par exemple

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

Pour en savoir plus sur les expressions régulières, rendez-vous sur http://regular-expression.info .

Cela dit, cela sent un peu que vous essayez d'inventer un analyseur CSV. Si tel est le cas, je suggérerais de rechercher les bibliothèques existantes, telles que OpenCSV .

BalusC
la source
6
ne pensez-vous pas qu'il remplacera toutes les occurrences de guillemets doubles par une chaîne vide plutôt que la première et la dernière.
GuruKulki
1
@ufk: Ce n'est pas une regex complexe. Vous voudrez peut - être autrement sans tracas avec un tas de String#indexOf(), String#substring(), les méthodes et ainsi de suite. C'est juste un peu plus rapide, mais c'est beaucoup plus de code. @GK: Euh, avez-vous lu / compris l'expression régulière ou même l'avez-vous testée?
BalusC
11
@GK le signe caret représente le début de la chaîne recherchée et le signe dollar représente sa fin. La barre oblique inverse ici "échappe" la citation suivante, elle est donc traitée comme un simple caractère. Donc, cette expression régulière dit, remplacez toutes les occurrences de guillemet au début, ou de guillemet à la fin, par la chaîne vide. Juste comme demandé.
Carl Manaster
2
@Marc: Je ne sais pas en quoi c'est un problème compte tenu de la question dans sa forme actuelle.
BalusC
8
Voici le regex en panne: ^\"|\"$. |signifie "ou". Il correspondra donc à ^\"ou \"$. ^correspond au début de la chaîne et $correspond à la fin de la chaîne. ^\"signifie correspondre à un guillemet au début de la chaîne et \"$correspond à un guillemet à la fin de la chaîne.
ibizaman
31

Pour supprimer le premier et le dernier caractère de la chaîne, utilisez:

myString = myString.substring(1, myString.length()-1);
Michael Myers
la source
18
Cela nécessite seulement que les citations doivent être garanties . S'il n'y a aucune garantie, vous devrez le vérifier au préalable.
BalusC
4
@BalusC: Certainement. D'après ma lecture de la question, il semble que la chaîne soit déjà connue pour être entourée de guillemets.
Michael Myers
.length est une propriété pas une fonction
Martin
2
@Martin: .length est une propriété des tableaux, mais .length () est une méthode de Strings.
Michael Myers
@MichaelMyers: Oups, désolé j'étais en mode JavaScript mental. Mon erreur.
Martin
16

Aussi avec 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"

Alors,

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

Cette méthode fonctionne à la fois avec des chaînes entre guillemets et sans guillemets, comme indiqué dans mon exemple. Le seul inconvénient est, il ne sera pas strictement appariés citations, seulement avant et arrière des guillemets (ie. Pas de distinction entre "partiallyet les "fully"chaînes entre guillemets).

rath
la source
13

Si les guillemets doubles n'existent qu'au début et à la fin, un code simple car cela fonctionnerait parfaitement:

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

sunraincyq
la source
13

C'est le meilleur moyen que j'ai trouvé, pour supprimer les guillemets doubles du début et de la fin d'une chaîne.

someString.replace (/(^")|("$)/g, '')
Yaniv Levi
la source
2
Peut-être inclure des guillemets simples remplacez (/ (^ \ "| \ ') | (\" | \' $) / g, "");
bob
11

En utilisant Guava, vous pouvez écrire plus élégamment CharMatcher.is('\"').trimFrom(mystring);

legrass
la source
2
est-il possible de couper un seul caractère? Par exemple, si ma chaîne se termine par deux guillemets simples, je souhaite que seuls les guillemets simples soient coupés.
vatsal mevada
10

Tout d'abord, nous vérifions si la chaîne est doublée entre guillemets et, le cas échéant, supprimons-les. Vous pouvez ignorer le conditionnel si en fait vous savez qu'il est entre guillemets.

if (string.length() >= 2 && string.charAt(0) == '"' && string.charAt(string.length() - 1) == '"')
{
    string = string.substring(1, string.length() - 1);
}
brcolow
la source
C'est la réponse la plus performante par ordre de grandeur et elle précise même ce qu'il faut faire concernant la présence facultative ou non des guillemets.
entonio
6

Kotlin

Dans Kotlin, vous pouvez utiliser String.removeSurrounding (délimiteur: CharSequence)

Par exemple

string.removeSurrounding("\"")

Supprime la chaîne de délimitation donnée du début et de la fin de cette chaîne si et seulement si elle commence par et se termine par le délimiteur . Sinon, renvoie cette chaîne inchangée.

Le code source ressemble à ceci:

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
la source
Il existe des centaines d'autres langages de programmation. Pourquoi avez-vous fourni la réponse pour Kotlin et pas pour les autres :-)?
nickolay.laptev
1
Bonne question @ nickolay.laptev! :) J'avais l'habitude d'écrire java et j'ai déménagé dans kotlin et comme je suis un développeur Android, j'ai pensé que cela pourrait avoir d'autres développeurs dans la même position, donc cela pourrait être utile pour eux aussi. En outre, la removeSurrounding()méthode que j'ai partagée ci-dessus me semblait facilement compréhensible par n'importe quel développeur Java.
Ryan Amaral
1
Cette réponse unique illustre tout l'intérêt d'adopter Kotlin dans votre base de code Java existante!
Kirill Groshkov le
3

Le modèle ci-dessous, lorsqu'il est utilisé avec java.util.regex.Matcher, correspondra à n'importe quelle chaîne entre guillemets sans affecter les occurrences de guillemets doubles à l'intérieur de la chaîne:

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

Modifier un peu la réponse de @ brcolow

if (string != null && string.length() >= 2 && string.startsWith("\"") && string.endsWith("\"") {
    string = string.substring(1, string.length() - 1);
}
Confus
la source
Je pense que l'argument de la méthode devrait être annoté avec @NonNullet qu'il devrait probablement avoir quelque chose comme à l' Objects.requireNonNull(string)intérieur parce que si quelqu'un appelle stripQuotes (null), il le fait probablement par erreur!
brcolow
2

Scala

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

Cela fonctionne indépendamment du fait que la chaîne ait ou non des guillemets au début et / ou à la fin.

Edit: Désolé, Scala uniquement

Brendan Maguire
la source
2

Edité: Je viens de réaliser que je devrais préciser que cela ne fonctionne que si les deux existent. Sinon, la chaîne n'est pas considérée comme entre guillemets. Un tel scénario m'est apparu lorsque je travaillais avec des fichiers 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\""
raisin
la source
1
Matcher m = Pattern.compile("^\"(.*)\"$").matcher(value);
String strUnquoted = value;
if (m.find()) {
    strUnquoted = m.group(1);
}
Ravikiran
la source
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
la source
1

Pour supprimer un ou plusieurs guillemets doubles du début et de la fin d'une chaîne en Java, vous devez utiliser une solution basée sur les regex:

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

Si vous devez également supprimer les guillemets simples:

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

REMARQUE : si votre chaîne contient à l' "intérieur, cette approche peut entraîner des problèmes (par exemple "Name": "John"=>Name": "John ).

Voir une démo Java ici :

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

trouver les index de chaque guillemet double et y insérer une chaîne vide.

GuruKulki
la source
il devrait donc s'agir du premier index et du dernier index de la double qoute.
GuruKulki