如何从字符串中去掉开头和结尾的双引号?

185

我想从一个字符串中删除开头和结尾的双引号 (")。
如何在Java中实现?谢谢!


1
该字符串已知是否带引号,还是检查引号是问题的一部分? - Michael Myers
19个回答

312
你可以使用 String#replaceAll() 方法,将模式设置为 ^\"|\"$ 实现此功能。
例如:
string = string.replaceAll("^\"|\"$", "");

如果想要了解更多关于正则表达式的内容,可以参考http://regular-expression.info

话虽如此,这有点像你正在尝试发明一个CSV解析器。如果是这样,我建议查找现有的库,比如OpenCSV


7
你不觉得它会用空字符串替换所有双引号的出现,而不仅仅是第一个和最后一个吗? - GuruKulki
18
@GK,插入符号(caret)表示所搜索字符串的开头,而美元符号表示其结尾。这里的反斜杠“转义”了后面的引号,使其被视为一个字符。因此,这个正则表达式的意思是将所有以引号开头或以引号结尾的部分替换为空字符串,就像请求的那样。 - Carl Manaster
1
如果字符串仅以双引号开头,则此方法无法正常工作。它仍将匹配正则表达式...... - Marc
3
@Marc:考虑到当前问题的形式,我不确定这是个问题。 - BalusC
10
这里是正则表达式的分解:^\"|\"$| 表示 "或"。因此,它将匹配 ^\"\"$^ 匹配字符串的开头,而 $ 匹配字符串的结尾。^\" 意味着匹配字符串开头处的引号,\"$ 则匹配字符串末尾处的引号。 - ibizaman
显示剩余9条评论

37

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

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

27
这只需要确保报价单存在即可。如果没有保证,那么你需要先进行检查。 - BalusC
4
当然可以。从我的阅读中,这个问题似乎已经知道字符串周围有引号。 - Michael Myers

28

使用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

这种方法适用于有引号和无引号的字符串,就像我的示例一样。唯一的缺点是,它不会严格查找匹配的引号,只查找前导和尾随引号字符(即在"部分"完全"引用字符串之间没有区别)。


25

Kotlin

在 Kotlin 中,您可以使用 String.removeSurrounding(delimiter: 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
}

21
如果双引号只存在于开头和结尾,那么这段简单的代码就能完美地解决问题: string = string.replace("\"", "");

同样适用于 build.gradle 文件。 - Thiago

17

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

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

4
或许可以使用单引号来替换 (/ (^"|')|("|\ '$) /g, "")。 - bob

14

首先,我们会检查字符串是否用双引号括起来,如果是的话就将其去掉。如果你确定它是双引号括起来的,那么可以跳过这个条件判断。

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

这是性能最好的答案,效率相差甚远,它甚至还指定了在引号是否存在时该怎么做。 - entonio

12

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


3
能否仅修剪单个字符?例如,如果我的字符串以两个单引号结尾,我仍然只想修剪一个单引号。 - vatsal mevada

6

我使用的东西就是这么简单:

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

4

要从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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接