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

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

【问题讨论】:

  • 已知字符串周围有引号,还是检查引号是问题的一部分?

标签: java string trim


【解决方案1】:

时髦

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

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

【讨论】:

    【解决方案2】:
    public String removeDoubleQuotes(String request) {
        return request.replace("\"", "");
    }
    

    【讨论】:

    • 此问题已包含多个答案和一个已接受的答案。您能否解释(通过编辑您的答案)您的答案与其他答案的不同之处?也知道从长远来看,仅代码的答案是没有用的。
    • 这个答案已经建议stackoverflow.com/a/25452078/1839439请不要添加另一个。
    • 我投票删除这个答案,因为它是stackoverflow.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 一起使用时,下面的模式将匹配双引号之间的任何字符串,而不会影响字符串内双引号的出现:

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

            【讨论】:

              【解决方案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】:

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

                        【讨论】:

                        • 所以它应该是双引号的第一个索引和最后一个索引。
                        猜你喜欢
                        • 2021-12-21
                        • 1970-01-01
                        • 2013-08-18
                        • 2011-03-01
                        • 2021-05-12
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多