如何修剪字符串的双引号和双引号?


139

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


1
是否已经知道字符串周围带有引号,还是检查引号是问题的一部分?
迈克尔·迈尔斯

Answers:


250

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

例如

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

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

也就是说,这有点像您要发明CSV解析器的味道。如果是这样,我建议您四处看看现有的库,例如OpenCSV


6
您是否认为它将用空字符串而不是第一个和最后一个替换所有出现的双引号。
GuruKulki 2010年

1
@ufk:这不是一个复杂的正则表达式。否则可能会想麻烦了一堆的String#indexOf()String#substring(),方法等。速度只有一点点加快,但是代码更多。@GK:嗯,您是否阅读/理解了正则表达式,甚至进行了测试?
BalusC 2010年

11
@GK插入号表示搜索到的字符串的开头,而美元符号表示其结尾。这里的反斜杠“转义”以下引用,因此将其视为字符。因此,此正则表达式表示,用空字符串替换所有出现在引号开头或结尾的引号。按照要求。
卡尔·曼纳斯特

2
@Marc:考虑到当前形式的问题,我不确定这是什么问题。
BalusC 2015年

8
这是正则表达式细分:^\"|\"$|表示“或”。因此它将匹配^\"\"$^匹配字符串的开头和字符串$的结尾。^\"表示在字符串的开头\"$匹配一个引号,并在字符串的末尾匹配一个引号。
ibizaman

31

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

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

18
这仅要求引号应保证存在。如果无法保证,则需要先进行检查。
BalusC 2010年

4
@BalusC:当然。从我对问题的阅读中,似乎已经知道该字符串周围带有引号。
迈克尔·迈尔斯

.length是属性而不是函数
马丁

2
@Martin:.length是数组的属性,但是.length()是String的方法。
迈克尔·迈尔斯

@MichaelMyers:糟糕,对不起,我处于心理JavaScript模式。我的错。
马丁

16

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


13

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

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


13

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

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

2
也许也包括单引号replace(/(^ \“ | \')|(\” | \'$)/ g,“”);
鲍勃,

11

使用番石榴,您可以写得更优雅 CharMatcher.is('\"').trimFrom(mystring);


2
是否可以只修剪单个字符?例如,如果我的字符串仍以两个单引号结尾,那么我只希望修剪单引号。
vatsal mevada

10

首先,我们检查字符串是否用双引号引起来,如果是,请将其删除。如果实际上知道双引号,则可以跳过该条件。

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

按数量级,这是性能最高的答案,它甚至指定了有关可选的引号或不存在的引号的操作。
entonio

6

科特林

在Kotlin中,您可以使用String.removeSurrounding(delimiter:CharSequence)

例如

string.removeSurrounding("\"")

当且仅当它以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
}

还有数百种其他编程语言。为什么您为Kotlin而不是其他人提供答案:-)?
nickolay.laptev,

1
好问题@ nickolay.laptev!:)我曾经写过Java,后来又搬进了kotlin,因为我是一名Android开发人员,所以我认为其他开发人员也可能处于同一位置,因此这对他们也很有用。另外,removeSurrounding()我在上面共享的方法对我来说也是一种Java开发人员都可以轻松理解的方法。
Ryan Amaral

1
这个单一的答案说明了在现有Java代码库中采用Kotlin的全部意义!
Kirill Groshkov

3

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

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

2

修改@brcolow的答案

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

我认为方法参数应该带有注释,@NonNull并且Objects.requireNonNull(string)内部可能应该有类似的东西,因为如果有人调用stripQuotes(null),他们可能是错误地这样做了!
brcolow


2

编辑:刚刚意识到,我应该指定仅当两者都存在时才有效。否则,该字符串将不被引用。在使用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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.