ฉันต้องการตัดการเริ่มต้นและสิ้นสุดเครื่องหมายคำพูดคู่ (") จากสตริง
ฉันจะบรรลุสิ่งนั้นใน Java ได้อย่างไรขอบคุณ!
ฉันต้องการตัดการเริ่มต้นและสิ้นสุดเครื่องหมายคำพูดคู่ (") จากสตริง
ฉันจะบรรลุสิ่งนั้นใน Java ได้อย่างไรขอบคุณ!
คำตอบ:
คุณสามารถใช้String#replaceAll()
กับรูปแบบ^\"|\"$
สำหรับสิ่งนี้
เช่น
string = string.replaceAll("^\"|\"$", "");
ต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการแสดงออกปกติมีอัล OOK ที่http://regular-expression.info
ที่กล่าวมานี้มีกลิ่นคล้ายกับว่าคุณกำลังพยายามประดิษฐ์ตัวแยกวิเคราะห์ CSV ถ้าเป็นเช่นนั้นผมขอแนะนำให้ไปดูรอบ ๆ ห้องสมุดที่มีอยู่เช่นOpenCSV
String#indexOf()
, String#substring()
วิธีการและอื่น ๆ เร็วขึ้นเพียงเล็กน้อย แต่เป็นโค้ดที่มากกว่า @GK: เอ่อคุณได้อ่าน / เข้าใจ regex หรือไม่หรือแม้แต่ทดสอบมัน?
^\"|\"$
. |
หมายถึง "หรือ" มันจึงจะตรงกับทั้งหรือ^\"
จับคู่จุดเริ่มต้นของสตริงและตรงกับจุดสิ้นสุดของสตริง หมายถึงจับคู่คำพูดที่จุดเริ่มต้นของสตริงและตรงกับคำพูดที่ท้ายสตริง \"$
^
$
^\"
\"$
หากต้องการลบอักขระตัวแรกและอักขระสุดท้ายออกจากสตริงให้ใช้:
myString = myString.substring(1, myString.length()-1);
นอกจากนี้กับ 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"
สตริงที่ยกมา)
นี่เป็นวิธีที่ดีที่สุดที่ฉันพบในการตัดเครื่องหมายคำพูดคู่จากจุดเริ่มต้นและจุดสิ้นสุดของสตริง
someString.replace (/(^")|("$)/g, '')
หากเครื่องหมายคำพูดคู่มีอยู่ที่จุดเริ่มต้นและจุดสิ้นสุดรหัสง่ายๆเช่นนี้จะทำงานได้อย่างสมบูรณ์:
string = string.replace("\"", "");
การใช้ Guava ช่วยให้คุณเขียนได้สวยหรูขึ้น CharMatcher.is('\"').trimFrom(mystring);
ขั้นแรกเราตรวจสอบว่าสตริงถูกยกมาสองเท่าหรือไม่และถ้าเป็นเช่นนั้นให้ลบออก คุณสามารถข้ามเงื่อนไขหากในความเป็นจริงคุณรู้ว่ามีการยกมาสองครั้ง
if (string.length() >= 2 && string.charAt(0) == '"' && string.charAt(string.length() - 1) == '"')
{
string = string.substring(1, string.length() - 1);
}
ใน 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
}
removeSurrounding()
วิธีการที่ฉันแบ่งปันข้างต้นยังช่วยให้ฉันเข้าใจได้ง่ายโดยนักพัฒนา java ทุกคน
เมื่อใช้กับรูปแบบด้านล่างjava.util.regex.Matcher
จะจับคู่สตริงใดก็ได้ระหว่างเครื่องหมายคำพูดคู่โดยไม่มีผลต่อการเกิดขึ้นของเครื่องหมายคำพูดคู่ภายในสตริง:
"[^\"][\\p{Print}]*[^\"]"
ในการลบเครื่องหมายคำพูดคู่อย่างน้อยหนึ่งรายการออกจากจุดเริ่มต้นและจุดสิ้นสุดของสตริงใน Java คุณต้องใช้โซลูชันที่ใช้ regex:
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
แก้ไขคำตอบของ @ brcolow เล็กน้อย
if (string != null && string.length() >= 2 && string.startsWith("\"") && string.endsWith("\"") {
string = string.substring(1, string.length() - 1);
}
@NonNull
และมันน่าจะมีอะไรบางอย่างObjects.requireNonNull(string)
อยู่ข้างในเพราะถ้ามีคนเรียก stripQuotes (null) พวกเขาอาจทำเช่นนั้นโดยไม่ได้ตั้งใจ!
แก้ไข: เพิ่งตระหนักว่าฉันควรระบุว่าสิ่งนี้ใช้ได้เฉพาะเมื่อมีทั้งสองอย่าง มิฉะนั้นจะไม่ถือว่าสตริงถูกยกมา สถานการณ์ดังกล่าวปรากฏให้ฉันเห็นเมื่อทำงานกับไฟล์ 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\""
Matcher m = Pattern.compile("^\"(.*)\"$").matcher(value);
String strUnquoted = value;
if (m.find()) {
strUnquoted = m.group(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;
}
สกาล่า
s.stripPrefix("\"").stripSuffix("\"")
สิ่งนี้ใช้ได้ไม่ว่าสตริงจะมีหรือไม่มีเครื่องหมายคำพูดตอนเริ่มต้นและ / หรือสิ้นสุด
แก้ไข: ขออภัย Scala เท่านั้น
ฉันกำลังใช้บางสิ่งที่เรียบง่ายเช่นนี้:
if(str.startsWith("\"") && str.endsWith("\""))
{
str = str.substring(1, str.length()-1);
}
ค้นหาดัชนีของแต่ละอัญประกาศและแทรกสตริงว่างที่นั่น
public String removeDoubleQuotes(String request) {
return request.replace("\"", "");
}