如何修剪字符串的开头和结尾双引号?

Posted

技术标签:

【中文标题】如何修剪字符串的开头和结尾双引号?【英文标题】:How can I trim beginning and ending double quotes from a string? 【发布时间】:2011-02-06 05:03:19 【问题描述】:

我想从字符串中剪掉开始和结束的双引号 (")。 我怎样才能在 Java 中实现这一点?谢谢!

【问题讨论】:

已知字符串周围有引号,还是检查引号是问题的一部分? 【参考方案1】:

时髦

您可以在 groovy 中使用正则表达式从字符串中减去子字符串:

String unquotedString = theString - ~/^"/ - ~/"$/

【讨论】:

【参考方案2】:
public String removeDoubleQuotes(String request) 
    return request.replace("\"", "");

【讨论】:

此问题已包含多个答案和一个已接受的答案。您能否解释(通过编辑您的答案)您的答案与其他答案的不同之处?也知道从长远来看,仅代码的答案是没有用的。 这个答案已经建议***.com/a/25452078/1839439请不要添加另一个。 我投票删除这个答案,因为它是***.com/a/25452078/1839439 的基本组成部分的复制品。此外,还有其他已删除的答案用于重新发布此答案。根据Flag Duplicate Answers on the same Question,SO 没有额外的价值来使用相同的解决方案保留两个答案。来自Review。【参考方案3】:

我正在使用这样简单的东西:

if(str.startsWith("\"") && str.endsWith("\""))
        
            str = str.substring(1, str.length()-1);
        

【讨论】:

【参考方案4】:

已编辑:刚刚意识到我应该指定这仅在它们都存在时才有效。否则,该字符串不被视为引用。我在处理 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\""

【讨论】:

【参考方案5】:

斯卡拉

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

无论字符串的开头和/或结尾是否有引号,这都有效。

编辑:抱歉,仅限 Scala

【讨论】:

【参考方案6】:

稍微修改@brcolow 的回答

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

【讨论】:

我认为方法参数应该用 @NonNull 注释,并且它可能应该在其中包含类似 Objects.requireNonNull(string) 的内容,因为如果有人调用 stripQuotes(null) 他们可能会这样做错误!【参考方案7】:

科特林

在 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

【讨论】:

【参考方案8】:

当与java.util.regex.Matcher 一起使用时,下面的模式将匹配双引号之间的任何字符串,而不会影响字符串内双引号的出现:

"[^\"][\\pPrint]*[^\"]"

【讨论】:

【参考方案9】:

要在 Java 中从字符串的开头和结尾删除一个或多个双引号,您需要使用基于正则表达式的解决方案:

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

如果您还需要删除单引号:

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

注意:如果您的字符串内部包含",这种方法可能会导致问题(例如"Name": "John" => Name": "John)。

查看Java demo here:

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

【讨论】:

【参考方案10】:

这是我发现的最好的方法,从字符串的开头和结尾去掉双引号。

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

【讨论】:

也可能包含单引号 replace(/(^\"|\')|(\"|\'$)/g, "");【参考方案11】:

还有 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" 引号字符串之间没有区别)。

【讨论】:

【参考方案12】:

首先,我们检查字符串是否被双引号,如果是,则删除它们。如果您知道条件是双引号,则可以跳过它。

if (string.length() >= 2 && string.charAt(0) == '"' && string.charAt(string.length() - 1) == '"')

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

【讨论】:

这是数量级上性能最高的答案,它甚至指定了关于可选或不存在引号的操作。【参考方案13】:
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;

【讨论】:

【参考方案14】:
Matcher m = Pattern.compile("^\"(.*)\"$").matcher(value);
String strUnquoted = value;
if (m.find()) 
    strUnquoted = m.group(1);

【讨论】:

【参考方案15】:

如果双引号只存在于开头和结尾,那么一个简单的代码就可以完美地工作:

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

【讨论】:

【参考方案16】:

使用 Guava 你可以写得更优雅CharMatcher.is('\"').trimFrom(mystring);

【讨论】:

是否可以只修剪单个字符?例如,如果我的字符串以两个单引号结尾,我仍然只想修剪单引号。【参考方案17】:

为此,您可以使用String#replaceAll()^\"|\"$ 模式。

例如

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

要了解有关正则表达式的更多信息,请查看http://regular-expression.info。

也就是说,这听起来有点像您正在尝试发明 CSV 解析器。如果是这样,我建议四处寻找现有的库,例如 OpenCSV。

【讨论】:

你不认为它会用空字符串而不是第一个和最后一个替换所有出现的双引号。 @ufk:这不是一个复杂的正则表达式。否则你可能想用一堆String#indexOf()String#substring()、方法等等来麻烦。它只是快一点,但它的代码要多得多。 @GK:呃,你读过/理解正则表达式甚至测试了吗? @GK 插入符号表示搜索字符串的开头,美元符号表示其结尾。这里的反斜杠“转义”了下面的引号,因此它被视为一个字符。所以这个正则表达式说,用空字符串替换所有出现在开头或结尾的引号。按照要求。 @Marc:考虑到当前形式的问题,我不确定这是一个问题。 这里是分解的正则表达式:^\"|\"$| 表示“或”。因此它将匹配^\"\"$^ 匹配字符串的开头,$ 匹配字符串的结尾。 ^\" 表示匹配字符串开头的引号,\"$ 匹配字符串末尾的引号。【参考方案18】:

要从字符串中删除第一个字符和最后一个字符,请使用:

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

【讨论】:

这只要求引号应该保证存在。如果没有保证,那么您需要先检查它。 @BalusC:当然。从我对问题的阅读来看,似乎已经知道该字符串周围有引号。【参考方案19】:

找到每个双引号的索引并在那里插入一个空字符串。

【讨论】:

所以它应该是双引号的第一个索引和最后一个索引。

以上是关于如何修剪字符串的开头和结尾双引号?的主要内容,如果未能解决你的问题,请参考以下文章

R语言 字符串

正则表达式在双引号内转义双引号

使用 regexp_extract 从 BigQuery 中删除单引号和双引号

修剪字符串中的多个字符

IchigoJam BASIC 在打印字符串时不需要双引号结尾

检查字符串是不是包含破折号并在单词中添加双引号