Bir dizeden çift tırnak başlangıcı ve bitişi nasıl kesebilirim?


139

Ben bir dize başlangıç ​​ve bitiş çift tırnak (") kırpmak istiyorum.Java bunu
nasıl başarabilirim?


1
Dizenin etrafında tırnak olduğu zaten biliniyor mu veya tırnak işareti sorunun bir parçası mı?
Michael Myers

Yanıtlar:


250

Bunun için String#replaceAll()bir desenle kullanabilirsiniz ^\"|\"$.

Örneğin

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

Normal ifadeler hakkında daha fazla bilgi edinmek için http://regular-expression.info adresini ziyaret edin .

Bununla birlikte, bu bir CSV ayrıştırıcısı icat etmeye çalıştığınız gibi kokuyor. Eğer öyleyse, OpenCSV gibi mevcut kütüphaneleri aramanızı öneririm .


6
çift ​​tırnakların tüm örneklerini ilk ve sondan ziyade boş dize ile değiştireceğini düşünmüyor musunuz?
GuruKulki

1
@ufk: Bu karmaşık bir normal ifade değil. Aksi takdirde, bir sürü String#indexOf(),, String#substring()vb. Yöntemlerle uğraşmak isteyebilirsiniz . Sadece biraz daha hızlı, ama çok daha fazla kod. @GK: Ah, normal ifadeyi okudun / anladın, hatta test ettin mi?
BalusC

11
@GK düzeltme işareti aranan dizenin başlangıcını, dolar işareti ise sonunu temsil eder. Buradaki ters eğik çizgi aşağıdaki alıntıyı "kaçar", bu yüzden sadece bir karakter olarak ele alınır. Yani bu normal ifade, başlangıçtaki tüm alıntı oluşumlarını veya sondaki alıntıyı boş dize ile değiştir diyor. Tam istendiği gibi.
Carl Manaster

2
@Marc: Soruyu şu anki haliyle düşünürken bunun nasıl bir sorun olduğundan emin değilim.
BalusC

8
İşte bozuldu regex geçerli: ^\"|\"$. |"veya" anlamına gelir. Böylece ya eşleşir ya ^\"da \"$. ^dizenin başlangıcıyla ve dizenin $sonuyla eşleşir. ^\", dizenin başındaki \"$bir alıntıyla eşleşir ve dizenin sonundaki bir alıntıyla eşleşir.
ibizaman

31

Dizeden ilk karakteri ve son karakteri kaldırmak için şunu kullanın:

myString = myString.substring(1, myString.length()-1);

18
Bu sadece tekliflerin mevcut olmasını garanti etmeyi gerektirir . Herhangi bir garanti yoksa, önce bunu kontrol etmeniz gerekir.
BalusC

4
@BalusC: Kesinlikle. Soruyu okuduğumdan beri, dizenin tırnak işaretleri olduğu zaten biliniyor.
Michael Myers

.length bir özellik değil bir özelliktir
Martin

2
@Martin: .length, dizilerin bir özelliğidir, ancak .length () bir Dizeler yöntemidir.
Michael Myers

@MichaelMyers: Hata! Üzgünüm, zihinsel JavaScript modundaydım. Benim hatam.
Martin

16

Ayrıca Apache ile 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"

Yani,

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

Bu yöntem, örneğimde gösterildiği gibi hem alıntılanmış hem de alıntılanmamış dizelerle çalışır. Tek dezavantajı, kesinlikle eşleşen tırnaklar için değil , sadece önde gelen ve sondaki alıntı karakterleri (yani. "partiallyVe "fully"alıntılanan dizeler arasında ayrım yok) aramayacaktır .


13

Çift tırnak işaretleri yalnızca başlangıçta ve sonunda varsa, basit bir kod mükemmel şekilde çalışır:

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


13

Bu, bir dizenin başından ve sonundan çift tırnak ayırmak için bulduğum en iyi yoldur.

someString.replace (/(^")|("$)/g, '')

2
Belki tek tırnak işareti de ekleyin (/ (^ \ "| \ ') | (\" | \' $) / g, "");
bob

11

Guava'yı kullanarak daha zarif yazabilirsiniz CharMatcher.is('\"').trimFrom(mystring);


2
sadece tek bir karakteri kesmek mümkün mü? Örneğin benim dize hala iki tek tırnak ile biterse, ben sadece tek tırnak kırpılmak istiyorum.
vatsal mevada

10

İlk olarak, Dizenin iki katına çıkarılıp alıntılanmayacağını kontrol ediyoruz ve eğer öyleyse bunları kaldırıyoruz. Aslında çift tırnak içine alındığını biliyorsanız, koşulu atlayabilirsiniz.

if (string.length() >= 2 && string.charAt(0) == '"' && string.charAt(string.length() - 1) == '"')
{
    string = string.substring(1, string.length() - 1);
}

Bu, büyüklük derecelerine göre en performanslı cevaptır ve tekliflerin isteğe bağlı olup olmadığı konusunda ne yapılacağını bile belirtir.
entonio

6

Kotlin

KOTLIN olarak kullanabileceğiniz String.removeSurrounding (sınırlayıcı: CharSequence)

Örneğin

string.removeSurrounding("\"")

Belirli bir sınırlayıcı dizesini, yalnızca ve sınırlayıcı ile başlayıp bitiyorsa, bu dizenin hem başından hem de sonundan kaldırır . Aksi takdirde bu dizeyi değiştirmeden döndürür.

Kaynak kodu şuna benzer:

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
}

Yüzlerce başka programlama dili var. Neden diğerleri için değil Kotlin için cevap verdiniz :-)?
nickolay.laptev

1
İyi soru @ nickolay.laptev! :) Java yazıyordum ve kotlin'e taşındım ve bir android geliştiricisi olduğum için aynı konumda başka geliştiricilere sahip olabileceğimi düşündüm, bu da onlar için yararlı olabilir. Ayrıca, removeSurrounding()yukarıda paylaştığım yöntem bana herhangi bir java geliştiricisi tarafından kolayca anlaşılabilecek bir şekilde baktı.
Ryan Amaral

1
Bu tek cevap, mevcut Java kod tabanınızda Kotlin'i benimsemenin tüm yönünü göstermektedir!
Kirill Groshkov

3

Aşağıdaki desen, ile kullanıldığında java.util.regex.Matcher, dize içindeki çift tırnak oluşumlarını etkilemeden çift tırnak arasındaki herhangi bir dizeyle eşleşir:

"[^\"][\\p{Print}]*[^\"]"

2

@ Brcolow'un cevabını biraz değiştirerek

if (string != null && string.length() >= 2 && string.startsWith("\"") && string.endsWith("\"") {
    string = string.substring(1, string.length() - 1);
}

Yöntem argümanı ile açıklamalı @NonNullve muhtemelen biri gibi bir şey olmalı Objects.requireNonNull(string)düşünürdüm çünkü birisi stripQuotes (null) çağırıyor, muhtemelen yanlışlıkla yapıyorlar!
brcolow

2

Scala

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

Bu, dizenin başında ve / veya sonunda tırnak olup olmamasına bakılmaksızın çalışır.

Düzenle: Üzgünüz, sadece Scala


2

Düzenlendi: Bunun yalnızca her ikisi de varsa işe yaradığını belirtmem gerektiğini fark ettim. Aksi takdirde dize tırnak içine alınmaz. CSV dosyalarıyla çalışırken bu senaryo benim için ortaya çıktı.

org.apache.commons.lang3.StringUtils.unwrap("\"abc\"", "\"")    = "abc"
org.apache.commons.lang3.StringUtils.unwrap("\"abc", "\"")    = "\"abc"
org.apache.commons.lang3.StringUtils.unwrap("abc\"", "\"")    = "abc\""

1
Matcher m = Pattern.compile("^\"(.*)\"$").matcher(value);
String strUnquoted = value;
if (m.find()) {
    strUnquoted = m.group(1);
}

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;
}

1

Java'da bir dizenin başlangıcından ve sonundan bir veya daha fazla çift tırnak işareti kaldırmak için normal ifade tabanlı bir çözüm kullanmanız gerekir:

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

Tek tırnakları da kaldırmanız gerekiyorsa:

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

NOT : Dizeniz "içeride içeriyorsa , bu yaklaşım sorunlara yol açabilir (örn. "Name": "John"=> Name": "John).

Burada bir Java demosuna bakın :

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

0

her çift tırnak için dizinleri bulun ve buraya boş bir dize ekleyin.


bu yüzden ilk endeks ve son çift qoute indeksi olmalıdır.
GuruKulki
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.