如何删除字符串

时间:2016-12-23 08:54:56

标签: java regex string

我想从字符串的两端删除单引号或双引号。该字符串可能包含其他引号或/和双引号,这些引号应保持不变 - 因此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下用单引号。我想做的就是摆脱它们。所以在我的用例中,引号总是对称的(它们匹配)。

但是我可以完美地使用一种解决方案,即使它们不匹配也会剥离它们,因为它们总是这样做

4 个答案:

答案 0 :(得分:6)

选项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'

答案 1 :(得分:1)

要完成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;
  }
}

答案 2 :(得分:0)

如果你正在寻找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;
    }
    }

答案 3 :(得分:0)

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