【问题标题】:How to remove single and double quotes at both ends of a string如何删除字符串两端的单引号和双引号
【发布时间】:2017-05-08 23:10:44
【问题描述】:

我想从字符串的两端删除单引号或双引号。该字符串可能包含额外的引号或/和双引号,它们应保持不变 - 所以removeAll() 不是一个选项。

String one = "\"some string\""; 
String two = "'some \"other string\"'";

// expected result
// some string
// some "other string"

到目前为止我尝试了什么:

two = two.replace("/^[\"\'])|([\"\']$/g", "");

以下方法可行,但必须有更优雅的方法来实现这一点..

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

有什么想法吗?

更新/澄清

我的用例是应用程序的命令行界面,用户也可以将文件/路径拖入其中,而不是输入它们。

在 Windows 下,拖动的文件用双引号括起来,在 Linux 下用单引号括起来。我想做的就是摆脱它们。所以在我的用例中,引号总是对称的(它们匹配)。

但我完全可以接受一个解决方案,即使它们不匹配也会剥离它们,因为它们总是匹配

【问题讨论】:

  • 您发布的代码以各种方式无效。请确保您发布实际编译的代码,除非您询问编译时错误。
  • Java 还是 JavaScript? removeAll()?你能调整一下问题/标签吗?
  • @Wiktor Stribiżew JAVA
  • 所以请发布有效的 Java 代码 - 并阐明您的要求。 (请参阅我的答案的评论。目前尚不清楚这是否是所需的行为。)
  • 不,代码仍然无法编译,如果您调用replace,则根本不使用正则表达式。你还没有明确你的要求。 minimal reproducible example(显示多个输入和预期输出)会有很大帮助。

标签: java regex string


【解决方案1】:

选项 1:从开头和结尾删除所有单引号和双引号

您可以使用replaceAll 接受正则表达式 - replace 不接受 - 并执行两次,一次用于字符串开头的引号,一次用于字符串末尾的引号:

public class Test {
    public static void main(String[] args) {
        String text = "\"'some \"other string\"'";
        String trimmed = text
            .replaceAll("^['\"]*", "")
            .replaceAll("['\"]*$", "");
        System.out.println(trimmed);
    }
}

第一个替换中的^ 将引号锚定到字符串的开头;第二个中的$ 将引号锚定到字符串的末尾。

请注意,与您以后的代码不同,这根本不会尝试“匹配”引号。

选项 2:从开头和结尾删除单引号字符(如果它们匹配)

String trimmed = text.replaceAll("^(['\"])(.*)\\1$", "$2");

如果它们都匹配,这将从开头和结尾修剪一个字符。示例:

public class Test {
    public static void main(String[] args) {
        trim("\"foo\"");
        trim("'foo'");
        trim("\"bar'");
        trim("'bar\"");
        trim("\"'baz'\"");
    }

    static void trim(String text) {
        String trimmed = text.replaceAll("^(['\"])(.*)\\1$", "$2");
        System.out.println(text + " => " + trimmed);
    }
}

输出:

"foo" => foo
'foo' => foo
"bar' => "bar'
'bar" => 'bar"
"'baz'" => 'baz'

【讨论】:

  • 这没有帮助,因为如果字符串是some text "text2",你会得到some text "text2
  • @WiktorStribiżew:我认为这就是意图。如果不是,OP肯定没有说清楚。
【解决方案2】:

要完成 Jon Skeet 响应,如果您只想在开头和结尾有一个引号时删除引号,您可以这样做:

public String removeQuotes(String str) {
  Pattern pattern = Pattern.compile("^['\"](.*)['\"]$");
  Matcher matcher = pattern.matcher(str);
  if (matcher.find()) {
    return matcher.group(1);
  } else {
    return str;
  }
}

【讨论】:

  • 对不起,我误以为你是原始发帖人。
  • 你能举一个不适合我的代码的例子吗?
  • 这个非常适合我的用例(见预期结果) - 谢谢!
  • 最后,这会更简单地写成return str.replaceAll("^['\"](.*)['\"]$", "$1");
【解决方案3】:

如果你正在寻找 javascript 试试这个:

   function t(k){
    var l="\"\'"; //you can add more chars here.
     if (l.indexOf(k[0])>-1) {
    return t(k.substr(1,k.length));
        } else if (l.indexOf(k[k.length-1])>-1) {
    return t(k.substr(0,k.length-1));
        } else {
     return k;
    }
    }

【讨论】:

    【解决方案4】:

    使用replaceFirst()的一种可能方式:

    String one = "\"some string\"";         
    System.out.println("one: " + one);               
    one = one.replaceFirst("\"", "");
    String reversed = new StringBuilder(one).reverse().toString();
    one = one.replaceFirst("\"", "");    
    one = new StringBuilder(reversed).reverse().toString();
    System.out.println("result: " + one);
    

    【讨论】:

      猜你喜欢
      • 2021-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多