Làm thế nào tôi có thể cắt đầu và kết thúc dấu ngoặc kép từ một chuỗi?


138

Tôi muốn cắt một trích dẫn kép bắt đầu và kết thúc (") từ một chuỗi.
Làm thế nào tôi có thể đạt được điều đó trong Java? Cảm ơn!


1
Là chuỗi đã được biết là có dấu ngoặc kép xung quanh nó, hoặc đang kiểm tra dấu ngoặc kép của vấn đề?
Michael Myers

Câu trả lời:


249

Bạn có thể sử dụng String#replaceAll()với một mô hình ^\"|\"$cho việc này.

Ví dụ

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

Để tìm hiểu thêm về các biểu thức thông thường, hãy tìm hiểu tại http://THER-expression.info .

Điều đó nói rằng, điều này có mùi hơi giống như bạn đang cố gắng phát minh một trình phân tích cú pháp CSV. Nếu vậy, tôi khuyên bạn nên tìm xung quanh các thư viện hiện có, chẳng hạn như OpenCSV .


6
bạn không nghĩ rằng nó sẽ thay thế tất cả các lần xuất hiện của dấu ngoặc kép bằng chuỗi rỗng thay vì chuỗi đầu tiên và cuối cùng.
GuruKulki

1
@ufk: Đây không phải là một regex phức tạp. Bạn khác có thể muốn gặp rắc rối với một loạt các String#indexOf(), String#substring(), phương pháp và vân vân. Nó chỉ nhanh hơn một chút, nhưng nó nhiều mã hơn. @GK: Uh, bạn đã đọc / hiểu regex hay thậm chí kiểm tra nó chưa?
BalusC

11
@GK dấu mũ biểu thị sự bắt đầu của chuỗi tìm kiếm và ký hiệu đô la biểu thị sự kết thúc của nó. Dấu gạch chéo ngược ở đây "thoát" trích dẫn sau đây để nó được coi như là một ký tự. Vì vậy, regex này nói, thay thế tất cả các lần xuất hiện của trích dẫn khi bắt đầu hoặc trích dẫn ở cuối, bằng chuỗi trống. Đúng như yêu cầu.
Carl Manaster

2
@Marc: Tôi không chắc đó là vấn đề như thế nào khi xem xét câu hỏi ở dạng hiện tại.
BalusC

8
Đây là regex được chia nhỏ : ^\"|\"$. |có nghĩa là "hoặc". Do đó, nó sẽ phù hợp hoặc ^\"hoặc \"$. ^khớp bắt đầu chuỗi và $khớp cuối chuỗi. ^\"có nghĩa là khớp với một trích dẫn ở đầu chuỗi và \"$khớp với một trích dẫn ở cuối chuỗi.
ibizaman

31

Để xóa ký tự đầu tiên và ký tự cuối cùng khỏi chuỗi, sử dụng:

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

18
Điều này chỉ yêu cầu rằng các báo giá nên được đảm bảo có mặt. Nếu không có gì đảm bảo, thì bạn cần kiểm tra trước.
BalusC

4
@BalusC: Chắc chắn. Từ việc đọc câu hỏi của tôi, có vẻ như chuỗi đã được biết là có dấu ngoặc kép xung quanh nó.
Michael Myers

.length là một tài sản không phải là một chức năng
Martin

2
@Martin: .length là một thuộc tính của mảng, nhưng .length () là một phương thức của Chuỗi.
Michael Myers

@MichaelMyer: Rất tiếc, xin lỗi tôi đang ở chế độ JavaScript tinh thần. Lỗi của tôi.
Martin

16

Cũng với 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"

Vì thế,

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

Phương pháp này hoạt động cả với các chuỗi được trích dẫn và không trích dẫn như trong ví dụ của tôi. Nhược điểm duy nhất là, nó sẽ không tìm đúng phù hợp với dấu ngoặc kép, chỉ ở đầu và đuôi ký tự quote (tức. Có sự phân biệt giữa "partially"fully"chuỗi trích dẫn).


13

Nếu dấu ngoặc kép chỉ tồn tại ở đầu và cuối, một mã đơn giản vì điều này sẽ hoạt động hoàn hảo:

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


13

Đây là cách tốt nhất mà tôi tìm thấy, để tách các trích dẫn kép từ đầu và cuối chuỗi.

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

2
Có thể bao gồm các trích dẫn đơn thay thế (/ (^ \ "| \ ') | (\" | \' $) / g, "");
bob

11

Sử dụng quả ổi bạn có thể viết thanh lịch hơn CharMatcher.is('\"').trimFrom(mystring);


2
Có thể cắt chỉ một ký tự? Ví dụ: nếu chuỗi của tôi kết thúc bằng hai dấu ngoặc đơn, tôi chỉ muốn trích dẫn duy nhất để được cắt bớt.
vatsal mevada

10

Đầu tiên, chúng tôi kiểm tra xem Chuỗi có được nhân đôi trích dẫn hay không và nếu có, hãy xóa chúng. Bạn có thể bỏ qua điều kiện nếu trên thực tế bạn biết đó là trích dẫn kép.

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

Đây là câu trả lời hiệu quả nhất theo thứ tự độ lớn và thậm chí nó chỉ định những việc cần làm liên quan đến sự hiện diện tùy chọn hoặc không có của dấu ngoặc kép.
entonio

6

Kotlin

Trong Kotlin bạn có thể sử dụng String.removeSurrounding (dấu phân cách: CharSequence)

Ví dụ

string.removeSurrounding("\"")

Xóa chuỗi phân cách đã cho khỏi cả bắt đầu và kết thúc chuỗi này khi và chỉ khi nó bắt đầu bằng và kết thúc bằng dấu phân cách . Nếu không thì trả về chuỗi này không thay đổi.

Mã nguồn trông như thế này:

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
}

Có hàng trăm ngôn ngữ lập trình khác. Tại sao bạn cung cấp câu trả lời cho Kotlin mà không phải cho người khác :-)?
nickolay.laptev

1
Câu hỏi hay @ nickolay.laptev! :) Tôi đã từng viết java và tôi đã chuyển sang kotlin và vì tôi là một nhà phát triển Android nên tôi nghĩ rằng có thể có các nhà phát triển khác ở cùng vị trí nên điều này cũng có thể hữu ích cho họ. Ngoài ra, removeSurrounding()phương pháp tôi chia sẻ ở trên có vẻ dễ hiểu đối với bất kỳ nhà phát triển java nào.
Ryan Amaral

1
Câu trả lời duy nhất này minh họa toàn bộ quan điểm của việc áp dụng Kotlin trong cơ sở mã Java hiện tại của bạn!
Kirill Groshkov

3

Mẫu bên dưới, khi được sử dụng với java.util.regex.Matcher, sẽ khớp với bất kỳ chuỗi nào giữa các dấu ngoặc kép mà không ảnh hưởng đến sự xuất hiện của dấu ngoặc kép bên trong chuỗi:

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

2

Sửa đổi câu trả lời của @ brcolow một chút

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

Tôi nghĩ rằng đối số phương thức nên được chú thích @NonNullvà nó có thể có một cái gì đó giống như Objects.requireNonNull(string)bên trong nó bởi vì nếu ai đó đang gọi dảiQuote (null) thì có lẽ họ đang làm như vậy do nhầm lẫn!
brcolow

2

Scala

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

Điều này hoạt động bất kể chuỗi có hoặc không có dấu ngoặc kép ở đầu và / hoặc kết thúc.

Chỉnh sửa: Xin lỗi, chỉ Scala


2

Chỉnh sửa: Chỉ cần nhận ra rằng tôi nên xác định rằng điều này chỉ hoạt động nếu cả hai tồn tại. Nếu không, chuỗi không được coi là trích dẫn. Kịch bản như vậy xuất hiện với tôi khi làm việc với các tệp 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

Để xóa một hoặc nhiều dấu ngoặc kép từ đầu và cuối chuỗi trong Java, bạn cần sử dụng giải pháp dựa trên regex:

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

Nếu bạn cũng cần xóa dấu ngoặc đơn:

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

LƯU Ý : Nếu chuỗi của bạn chứa "bên trong, cách tiếp cận này có thể dẫn đến các vấn đề (ví dụ "Name": "John"=>Name": "John ).

Xem bản demo Java tại đây :

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

0

tìm chỉ mục của mỗi dấu ngoặc kép và chèn một chuỗi trống ở đó.


vì vậy nó phải là chỉ mục đầu tiên và chỉ mục cuối cùng của double qoute.
GuruKulki
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.