Как я могу обрезать начало и конец двойных кавычек из строки?


139

Я хотел бы обрезать начало и конец двойной кавычки (") из строки.
Как я могу добиться этого в Java? Спасибо!


1
Известно ли, что в строке уже есть кавычки, или проверка кавычек является частью проблемы?
Майкл Майерс

Ответы:


250

Вы можете использовать String#replaceAll()с шаблоном ^\"|\"$для этого.

Например

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

Чтобы узнать больше о регулярных выражениях, зайдите на http://regular-expression.info .

Тем не менее, это немного похоже на то, что вы пытаетесь изобрести парсер CSV. Если так, я бы посоветовал поискать существующие библиотеки, такие как OpenCSV .


6
Не думаете ли вы, что он заменяет все вхождения двойных кавычек пустой строкой, а не первым и последним.
ГуруКульки

1
@ufk: это не сложное регулярное выражение. Вы в противном случае может потребоваться хлопот с кучей String#indexOf(), String#substring()методы и так далее. Это только немного быстрее, но это намного больше кода. @GK: Вы читали / понимали регулярное выражение или даже проверяли его?
BalusC

11
@GK каретка представляет начало искомой строки, а знак доллара - ее конец. Обратная косая черта здесь "ускользает" от следующей цитаты, поэтому она рассматривается как символ. Таким образом, это регулярное выражение говорит: замените все вхождения кавычки в начале или кавычки в конце пустой строкой. Так же, как и просили.
Карл Манастер

2
@Marc: я не уверен, как это проблема, рассматривая вопрос в его нынешнем виде.
BalusC

8
Вот регулярное выражение разломать ^\"|\"$. |означает «или». Таким образом, это будет соответствовать либо ^\"или \"$. ^соответствует началу строки и $соответствует концу строки. ^\"означает совпадение с кавычкой в ​​начале строки и \"$совпадение с кавычкой в ​​конце строки.
ibizaman

31

Чтобы удалить первый и последний символ из строки, используйте:

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

18
Это только требует, чтобы кавычки гарантированно присутствовали. Если нет гарантии, то вам нужно сначала проверить это заранее.
BalusC

4
@BalusC: Конечно. Из моего прочтения вопроса кажется, что в строке уже есть кавычки.
Майкл Майерс

.length это свойство, а не функция
Martin

2
@Martin: .length является свойством массивов, но .length () является методом Strings.
Майкл Майерс

@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
Может быть, включить одинарные кавычки тоже заменить (/ (^ \ "| \ ') | (\" | \' $) / g, "");
Боб

11

Используя Guava вы можете писать более элегантно CharMatcher.is('\"').trimFrom(mystring);


2
можно ли обрезать только один символ? Например, если моя строка заканчивается двумя одинарными кавычками, я хочу, чтобы обрезали только одну кавычку.
Ватсал Мевада

10

Сначала мы проверяем, если строка String удвоена в кавычках, и, если это так, удалите их. Вы можете пропустить условное условие, если на самом деле вы знаете, что оно заключено в двойные кавычки.

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! :) Я писал java и перешел на kotlin, и, поскольку я разработчик для Android, я подумал, что другие разработчики могут быть в той же позиции, так что это может быть полезно и для них. Кроме того, removeSurrounding()метод, которым я поделился выше, показался мне понятным любому разработчику java.
Райан Амарал

1
Этот единственный ответ иллюстрирует весь смысл принятия Kotlin в вашей существующей кодовой базе Java!
Кирилл Грошков

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

Я думаю, что аргумент метода должен быть аннотирован, @NonNullи он, вероятно, должен иметь что-то вроде Objects.requireNonNull(string)этого, потому что, если кто-то вызывает stripQuotes (null), он, вероятно, делает это по ошибке!
brcolow

2

Scala

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 ).

Посмотрите демонстрацию Java здесь :

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

0

найдите индексы каждой двойной кавычки и вставьте туда пустую строку.


так что это должен быть первый индекс и последний индекс двойного qoute.
ГуруКульки
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.