【发布时间】:2011-02-06 05:03:19
【问题描述】:
我想从字符串中剪掉开始和结束的双引号 (")。
我怎样才能在 Java 中实现这一点?谢谢!
【问题讨论】:
-
已知字符串周围有引号,还是检查引号是问题的一部分?
我想从字符串中剪掉开始和结束的双引号 (")。
我怎样才能在 Java 中实现这一点?谢谢!
【问题讨论】:
您可以在 groovy 中使用正则表达式从字符串中减去子字符串:
String unquotedString = theString - ~/^"/ - ~/"$/
【讨论】:
public String removeDoubleQuotes(String request) {
return request.replace("\"", "");
}
【讨论】:
我正在使用这样简单的东西:
if(str.startsWith("\"") && str.endsWith("\""))
{
str = str.substring(1, str.length()-1);
}
【讨论】:
已编辑:刚刚意识到我应该指定这仅在它们都存在时才有效。否则,该字符串不被视为引用。我在处理 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\""
【讨论】:
斯卡拉
s.stripPrefix("\"").stripSuffix("\"")
无论字符串的开头和/或结尾是否有引号,这都有效。
编辑:抱歉,仅限 Scala
【讨论】:
稍微修改@brcolow 的回答
if (string != null && string.length() >= 2 && string.startsWith("\"") && string.endsWith("\"") {
string = string.substring(1, string.length() - 1);
}
【讨论】:
@NonNull 注释,并且它可能应该在其中包含类似 Objects.requireNonNull(string) 的内容,因为如果有人调用 stripQuotes(null) 他们可能会这样做错误!
在 Kotlin 中,您可以使用 String.removeSurrounding(delimiter: CharSequence)
例如
string.removeSurrounding("\"")
当且仅当它以 delimiter 开头和结尾时,从该字符串的开头和结尾删除给定的 delimiter 字符串。 否则返回此字符串不变。
源代码如下所示:
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
}
【讨论】:
当与java.util.regex.Matcher 一起使用时,下面的模式将匹配双引号之间的任何字符串,而不会影响字符串内双引号的出现:
"[^\"][\\p{Print}]*[^\"]"
【讨论】:
要在 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
【讨论】:
这是我发现的最好的方法,从字符串的开头和结尾去掉双引号。
someString.replace (/(^")|("$)/g, '')
【讨论】:
还有 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" 引号字符串之间没有区别)。
【讨论】:
首先,我们检查字符串是否被双引号,如果是,则删除它们。如果您知道条件是双引号,则可以跳过它。
if (string.length() >= 2 && string.charAt(0) == '"' && string.charAt(string.length() - 1) == '"')
{
string = string.substring(1, string.length() - 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;
}
【讨论】:
Matcher m = Pattern.compile("^\"(.*)\"$").matcher(value);
String strUnquoted = value;
if (m.find()) {
strUnquoted = m.group(1);
}
【讨论】:
如果双引号只存在于开头和结尾,那么一个简单的代码就可以完美地工作:
string = string.replace("\"", "");
【讨论】:
使用 Guava 你可以写得更优雅CharMatcher.is('\"').trimFrom(mystring);
【讨论】:
为此,您可以使用String#replaceAll() 和^\"|\"$ 模式。
例如
string = string.replaceAll("^\"|\"$", "");
要了解有关正则表达式的更多信息,请查看http://regular-expression.info。
也就是说,这听起来有点像您正在尝试发明 CSV 解析器。如果是这样,我建议四处寻找现有的库,例如 OpenCSV。
【讨论】:
String#indexOf()、String#substring()、方法等等来麻烦。它只是快一点,但它的代码要多得多。 @GK:呃,你读过/理解正则表达式甚至测试了吗?
^\"|\"$。 | 表示“或”。因此它将匹配^\" 或\"$。 ^ 匹配字符串的开头,$ 匹配字符串的结尾。 ^\" 表示匹配字符串开头的引号,\"$ 匹配字符串末尾的引号。
要从字符串中删除第一个字符和最后一个字符,请使用:
myString = myString.substring(1, myString.length()-1);
【讨论】:
找到每个双引号的索引并在那里插入一个空字符串。
【讨论】: