文字列から最初と最後の二重引用符を削除するにはどうすればよいですか?


138

文字列の最初と最後の二重引用符( ")
を削除したいのですが、Javaでそれを実現するにはどうすればよいですか?ありがとう!


1
文字列は既に引用符で囲まれていることがわかっていますか、それとも引用符のチェックが問題の一部になっていますか?
マイケルマイヤーズ

回答:


249

このためのString#replaceAll()柄でお使いいただけます^\"|\"$

例えば

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

正規表現の詳細については、http: //regular-expression.infoをご覧ください。

つまり、これは、CSVパーサーを発明しようとしているような匂いがします。その場合は、OpenCSVなどの既存のライブラリを探してみることをお勧めします。


6
最初と最後ではなく、すべての二重引用符を空の文字列に置き換えます。
GuruKulki

1
@ufk:これは複雑な正規表現ではありません。あなたはそれ以外の束と口論にしたいことがありString#indexOf()String#substring()、方法など。少しだけ速くなりますが、はるかに多くのコードです。@GK:ええと、正規表現を読んだり理解したり、テストしたりしましたか?
BalusC 2010

11
@GKキャレットは検索文字列の始まりを表し、ドル記号はその終わりを表します。ここのバックスラッシュは次の引用を「エスケープ」するため、単なる文字として扱われます。したがって、この正規表現は、最初の引用符または最後の引用符をすべて空の文字列に置き換えます。要求通り。
Carl Manaster、2010

2
@マーク:現在の形の質問を考えると、それがどのように問題なのかはわかりません。
BalusC

8
正規表現の内訳は次のとおり^\"|\"$です。|「または」を意味します。したがって、^\"またはのいずれかに一致します\"$^文字列の先頭と$一致し、文字列の末尾と一致します。^\"文字列の先頭の\"$引用符に一致し、文字列の末尾の引用符に一致することを意味します。
ibizaman 2017年

31

文字列から最初の文字と最後の文字を削除するには、次を使用します。

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

18
これは、引用が存在することを保証する必要があるだけです。保証がない場合は、事前に確認する必要があります。
BalusC 2010

4
@BalusC:確かに。質問を読んだところ、文字列は既に引用符で囲まれていることがわかっているようです。
マイケルマイヤーズ

.lengthは関数ではなくプロパティです
Martin

2
@Martin:.lengthは配列のプロパティですが、.length()は文字列のメソッドです。
マイケルマイヤーズ

@MichaelMyers:おっと、申し訳ありませんが、メンタルJavaScriptモードになりました。私の間違い。
マーティン

16

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"

そう、

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

このメソッドは、私の例に示すように、引用符付き文字列と引用符なし文字列の両方で機能します。唯一の欠点は、厳密に一致する引用符を検索ず、先頭と末尾の引用文字のみを検索することです(つまり"partially"fully"引用符で囲まれた文字列を区別しません)。


13

二重引用符が最初と最後にしか存在しない場合、次のような単純なコードで完全に機能します。

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


13

これは、文字列の最初と最後から二重引用符を取り除くために私が見つけた最良の方法です。

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

2
多分一重引用符も含めるかもしれませんreplace(/(^ \ "| \ ')|(\" | \' $)/ g、 "");
ボブ

11

Guavaを使用すると、よりエレガントに書くことができます CharMatcher.is('\"').trimFrom(mystring);


2
単一の文字のみをトリミングすることは可能ですか?たとえば、私の文字列が2つの一重引用符で終わっている場合でも、一重引用符だけを削除します。
vatsal mevada 2015

10

まず、文字列が二重引用符で囲まれているかどうかを確認し、二重引用符が付いている場合は削除します。二重引用符で囲まれていることがわかっている場合は、条件をスキップできます。

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

これは桁違いで最もパフォーマンスの高い回答であり、引用符のオプションの有無について何をすべきかを指定します。
entonio 2017

6

コトリン

Kotlinでは、String.removeSurrounding(delimiter:CharSequence)を使用できます

例えば

string.removeSurrounding("\"")

与えられた削除区切り、それはで始まるで終わる場合にだけ開始し、この文字列の両端から文字列を区切り文字。それ以外の場合は、この文字列を変更せずに返します。

ソースコードは次のようになります。

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
}

他の何百ものプログラミング言語があります。なぜあなたは他の人ではなくKotlinに答えを提供したのですか:-)?
nickolay.laptev

1
良い質問@ nickolay.laptev!:)私は以前Javaを書いていて、kotlinに引っ越してきました。私はAndroid開発者なので、他の開発者も同じ立場にいる可能性があるので、これも彼らに役立つと思いました。また、removeSurrounding()上記で共有したメソッドは、Java開発者が簡単に理解できる可能性のあるものでした。
Ryan Amaral

1
この単一の回答は、既存のJavaコードベースにKotlinを採用することの要点を示しています。
Kirill Groshkov

3

以下のパターンをと共に使用するとjava.util.regex.Matcher、文字列内の二重引用符の出現に影響を与えることなく、二重引用符の間の任意の文字列に一致します。

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

2

@brcolowの回答を少し変更する

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

誰かがstripQuotes(null)を呼び出している場合、おそらく間違ってそうしているので、メソッド引数には注釈を付ける@NonNullべきであり、おそらくObjects.requireNonNull(string)その中に何かがあるはずだと思います!
-brcolow

2

Scala

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

これは、文字列の最初と最後に引用符があるかどうかに関係なく機能します。

編集:すみません、Scalaのみ


2

編集:両方が存在する場合にのみ機能することを指定する必要があることを認識しました。それ以外の場合、文字列は引用符で囲まれているとは見なされません。このようなシナリオは、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\""

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で文字列の最初と最後から1つ以上の二重引用符を削除するには、正規表現ベースのソリューションを使用する必要があります。

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

一重引用符も削除する必要がある場合:

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

:文字列が"中に含まれている場合、このアプローチは問題を引き起こす可能性があります(例"Name": "John"=>Name": "John)。

こちらのJavaデモをご覧ください

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

0

各二重引用符のインデックスを見つけて、そこに空の文字列を挿入します。


したがって、それはdouble qouteの最初のインデックスと最後のインデックスである必要があります。
GuruKulki
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.