문자열에서 큰 따옴표를 시작하고 끝내는 방법은 무엇입니까?


139

문자열에서 시작과 끝 큰 따옴표 ( ")를 자르고 싶습니다.
Java로 어떻게 달성 할 수 있습니까? 감사합니다!


1
문자열에 이미 따옴표가 있거나 알려진 따옴표가 문제의 일부입니까?
Michael Myers

답변:


250

String#replaceAll()패턴으로 사용할 수 있습니다 ^\"|\"$.

예 :

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

정규식에 대한 자세한 내용은 http://regular-expression.info를 참조하십시오 .

즉, 이것은 CSV 파서를 발명하려는 것처럼 약간 냄새가납니다. 그렇다면 OpenCSV 와 같은 기존 라이브러리를 살펴 보는 것이 좋습니다 .


6
큰 따옴표의 모든 발생을 첫 번째와 마지막이 아닌 빈 문자열로 대체한다고 생각하지 않습니다.
GuruKulki

1
@ufk : 복잡한 정규 표현식이 아닙니다. 당신은 달리의 무리와 번거 로움을 할 수 있습니다 String#indexOf(), String#substring(), 방법 등등. 조금 더 빠르지 만 훨씬 더 많은 코드입니다. @GK : 어, 정규식을 읽거나 이해했거나 테스트 했습니까?
BalusC

11
@GK 캐럿은 검색된 문자열의 시작을 나타내고 달러 기호는 끝을 나타냅니다. 여기에서 백 슬래시는 다음 인용문을 "탈출"하므로 문자로 취급됩니다. 따라서이 정규 표현식에 따르면 시작시 따옴표 또는 끝에 따옴표를 빈 문자열로 바꿉니다. 요청한대로.
Carl Manaster

2
@ 마크 : 현재의 형태로 질문을 고려할 때 그것이 어떻게 문제인지 잘 모르겠습니다.
BalusC

8
정규식은 다음과 같습니다 ^\"|\"$.. |"또는"을 의미합니다. 따라서 ^\"또는 중 하나와 일치합니다 \"$. ^문자열의 시작과 $일치하고 문자열의 끝 과 일치합니다. ^\"문자열의 시작 부분에서 \"$따옴표 와 일치 하고 문자열 의 끝에서 따옴표 와 일치합니다.
ibizaman

31

문자열에서 첫 번째 문자와 마지막 문자를 제거하려면 다음을 사용하십시오.

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

18
이것은 단지 따옴표를해야한다고 요구한다 보장 존재. 보증이 없으면 먼저 확인해야합니다.
BalusC

4
@BalusC : 물론입니다. 질문을 읽었을 때 문자열에 이미 따옴표가있는 것으로 보입니다.
Michael Myers

.length는 함수가 아닌 속성입니다.
Martin

2
@Martin : .length는 배열의 속성이지만 .length ()는 문자열의 메서드입니다.
Michael Myers

@MichaelMyers : 죄송합니다. 멘탈 JavaScript 모드에있었습니다. 내 실수.
Martin

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, "");
bob

11

구아바를 사용하면 더 우아하게 쓸 수 있습니다 CharMatcher.is('\"').trimFrom(mystring);


2
단일 문자 만 다듬을 수 있습니까? 예를 들어 문자열이 두 개의 작은 따옴표로 끝나는 경우 작은 따옴표 만 자르기를 원합니다.
vatsal mevada

10

먼저 문자열이 큰 따옴표로 묶여 있는지 확인하고, 그렇다면 문자열을 제거하십시오. 실제로 큰 따옴표로 묶인 경우 조건부를 건너 뛸 수 있습니다.

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

이것은 규모에 따라 가장 성능이 좋은 답변이며 따옴표의 선택 또는 존재 여부와 관련하여 수행 할 작업도 지정합니다.
entonio

6

코 틀린

Kotlin에서는 String.removeSurrounding (구분자 : 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! :) 나는 자바를 작성하고 kotlin으로 이사했으며 안드로이드 개발자이기 때문에 같은 위치에 다른 개발자가있을 수 있다고 생각했기 때문에 이것도 그들에게 유용 할 수 있다고 생각했습니다. 또한 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

스칼라

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

문자열의 시작 및 / 또는 끝에 따옴표가 있는지 여부에 관계없이 작동합니다.

편집 : 미안, 스칼라 만


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에서 문자열의 시작과 끝에서 하나 이상의 큰 따옴표를 제거하려면 정규식 기반 솔루션을 사용해야합니다.

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

작은 따옴표도 제거해야하는 경우 :

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

참고 : 문자열에 "내부 가 포함 된 경우이 방법으로 문제가 발생할 수 있습니다 (예 : "Name": "John"=> Name": "John).

참조하십시오 여기에 자바 데모 :

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.