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 .
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:
finalStringSchrodingersQuotedString="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).
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.
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.
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)}returnthis}
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:
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é: 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.
Réponses:
Vous pouvez utiliser
String#replaceAll()
avec un modèle de^\"|\"$
pour cela.Par exemple
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 .
la source
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?^\"|\"$
.|
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.Pour supprimer le premier et le dernier caractère de la chaîne, utilisez:
la source
Aussi avec Apache
StringUtils.strip()
:Alors,
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
"partially
et les"fully"
chaînes entre guillemets).la source
Si les guillemets doubles n'existent qu'au début et à la fin, un code simple car cela fonctionnerait parfaitement:
string = string.replace("\"", "");
la source
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.
la source
En utilisant Guava, vous pouvez écrire plus élégamment
CharMatcher.is('\"').trimFrom(mystring);
la source
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.
la source
Kotlin
Dans Kotlin, vous pouvez utiliser String.removeSurrounding (délimiteur: CharSequence)
Par exemple
Le code source ressemble à ceci:
la source
removeSurrounding()
méthode que j'ai partagée ci-dessus me semblait facilement compréhensible par n'importe quel développeur Java.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:la source
Modifier un peu la réponse de @ brcolow
la source
@NonNull
et 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!Scala
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
la source
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.
la source
la source
la source
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:
Si vous devez également supprimer les guillemets simples:
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 :
la source
trouver les index de chaque guillemet double et y insérer une chaîne vide.
la source