Як я можу обрізати подвійні лапки з рядка?


139

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


1
Чи відомо, що в рядку є цитати навколо нього, чи перевірка цитат є частиною проблеми?
Майкл Майерс

Відповіді:


250

Для цього можна використовувати String#replaceAll()візерунок ^\"|\"$.

Напр

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

Щоб дізнатися більше про регулярні вирази, завітайте на http://regular-expression.info .

Тим не менш, це трохи пахне тим, що ви намагаєтесь винайти аналізатор CSV. Якщо так, я б запропонував оглянути існуючі бібліотеки, наприклад, OpenCSV .


6
ви не думаєте, що це замінить усі випадки подвійних лапок порожнім рядком, а не першим та останнім.
GuruKulki

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

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

2
@Marc: Я не впевнений, як це проблема, враховуючи питання в його теперішній формі.
BalusC

8
Ось регулярний вираз розламати ^\"|\"$. |означає "або". Таким чином, це буде відповідати ^\"або \"$. ^відповідність початку рядка і $відповідність кінця рядка. ^\"означає відповідати цитаті на початку рядка і \"$відповідає цитаті в кінці рядка.
ібізаман

31

Щоб видалити перший і останній символи з рядка, використовуйте:

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

18
Для цього потрібно лише , що котирування повинні гарантовано бути присутнім. Якщо немає гарантії, вам потрібно буде попередньо перевірити це.
BalusC

4
@BalusC: Безумовно. З мого прочитання питання, здається, що в рядку вже відомо, що навколо нього є цитати.
Майкл Майерс

.length - це властивість, а не функція
Мартін

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

11

За допомогою Guava ви можете писати елегантніше 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

Котлін

У Котліні ви можете використовувати 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
}

Є сотні інших мов програмування. Чому ви надали відповідь Котліну, а не іншим :-)?
nickolay.laptev

1
Добре запитання @ nickolay.laptev! :) Я писав Java, і я перейшов у kotlin, і, оскільки я розробник андроїд, я думав, що можуть бути інші розробники в тому ж положенні, щоб це могло бути корисним і для них. Крім того, 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

Скала

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

знайдіть індекси кожної подвійної лапки і вставте туди порожній рядок.


тому це має бути перший індекс і останній індекс подвійної квоти.
GuruKulki
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.