Подтвердить что ты не робот

Обрезать символы в Java

Как я могу обрезать символы в Java?
например

String j = "\joe\jill\".Trim(new char[] {"\"});

j должно быть

"джо\Jill"

String j = "jack\joe\jill\".Trim("jack");

j должно быть

"\ джо\Джил \"

и т.д.

4b9b3361

Ответ 1

В Apache Commons есть отличный класс StringUtils (org.apache.commons.lang.StringUtils). В StringUtils есть метод strip(String, String) который будет делать то, что вы хотите.

В любом случае я настоятельно рекомендую использовать Apache Commons, особенно библиотеки Collections и Lang.

Ответ 2

Это делает то, что вы хотите:

public static void main (String[] args) {
    String a = "\\joe\\jill\\";
    String b = a.replaceAll("\\\\$", "").replaceAll("^\\\\", "");
    System.out.println(b);
}

$ используется для удаления последовательности в конце строки. ^ используется для удаления в начале.

В качестве альтернативы вы можете использовать синтаксис:

String b = a.replaceAll("\\\\$|^\\\\", "");

| означает "или".

Если вы хотите обрезать другие символы, просто примените регулярное выражение:

String b = a.replaceAll("y$|^x", ""); // will remove all the y from the end and x from the beggining

Ответ 3

CharMatcher - Google Guava

В прошлом я бы второй раз ответил ответ на сообщение Colins Apache. Но теперь, когда выпущен Googles guava-libraries, CharMatcher класс будет делать то, что вы хотите довольно красиво:

String j = CharMatcher.is('\\').trimFrom("\\joe\\jill\\"); 
// j is now joe\jill

CharMatcher имеет очень простой и мощный набор API, а также некоторые предопределенные константы, которые делают манипуляции очень легкими. Например:

CharMatcher.is(':').countIn("a:b:c"); // returns 2
CharMatcher.isNot(':').countIn("a:b:c"); // returns 3
CharMatcher.inRange('a', 'b').countIn("a:b:c"); // returns 2
CharMatcher.DIGIT.retainFrom("a12b34"); // returns "1234"
CharMatcher.ASCII.negate().removeFrom("a®¶b"); // returns "ab";

Очень приятный материал.

Ответ 4

Вот еще одно не-regexp, не супер-awesome, не супер-оптимизированное, но очень легкое для понимания решение non-external-lib:

public static String trimStringByString(String text, String trimBy) {
    int beginIndex = 0;
    int endIndex = text.length();

    while (text.substring(beginIndex, endIndex).startsWith(trimBy)) {
        beginIndex += trimBy.length();
    } 

    while (text.substring(beginIndex, endIndex).endsWith(trimBy)) {
        endIndex -= trimBy.length();
    }

    return text.substring(beginIndex, endIndex);
}

Использование:

String trimmedString = trimStringByString(stringToTrim, "/");

Ответ 5

Вы можете использовать removeStart и removeEnd из Apache Commons Lang StringUtils

Ответ 6

Ручная работа для первого варианта:

public class Rep {
    public static void main( String [] args ) {
       System.out.println( trimChar( '\\' , "\\\\\\joe\\jill\\\\\\\\" )  ) ;
       System.out.println( trimChar( '\\' , "joe\\jill" )  ) ;
    }
    private static String trimChar( char toTrim, String inString ) { 
        int from = 0;
        int to = inString.length();

        for( int i = 0 ; i < inString.length() ; i++ ) {
            if( inString.charAt( i ) != toTrim) {
                from = i;
                break;
            }
        }
        for( int i = inString.length()-1 ; i >= 0 ; i-- ){ 
            if( inString.charAt( i ) != toTrim ){
                to = i;
                break;
            }
        }
        return inString.substring( from , to );
    }
}

Печать

joe\jil

joe\jil

Ответ 7

РЕДАКТИРОВАТЬ: изменен путем ответа на замену только первого и последнего символа \\.

System.err.println("\\joe\\jill\\".replaceAll("^\\\\|\\\\$", ""));

Ответ 8

Я не думаю, что есть встроенная функция для обрезания на основе переданной строки. Вот небольшой пример того, как это сделать. Это вряд ли наиболее эффективное решение, но оно, вероятно, достаточно быстро для большинства ситуаций, оценивает и адаптируется к вашим потребностям. Я рекомендую тестировать производительность и оптимизировать по мере необходимости для любого фрагмента кода, который будет использоваться регулярно. Ниже приведена некоторая временная информация.

public String trim( String stringToTrim, String stringToRemove )
{
    String answer = stringToTrim;

    while( answer.startsWith( stringToRemove ) )
    {
        answer = answer.substring( stringToRemove.length() );
    }

    while( answer.endsWith( stringToRemove ) )
    {
        answer = answer.substring( 0, answer.length() - stringToRemove.length() );
    }

    return answer;
}

Этот ответ предполагает, что символы, подлежащие обрезке, являются строкой. Например, переход в "abc" приведет к обрезанию "abc", но не "bbc" или "cba" и т.д.

Некоторое время выполнения для каждого из следующих 10 миллионов раз.

" mile ".trim(); работает в 248 мс, включенных в качестве эталонной реализации для сравнения производительности.

trim( "smiles", "s" ); работает в 547 мс - примерно в 2 раза больше, чем метод java String.trim().

"smiles".replaceAll("s$|^s",""); работает в 12 306 мс - примерно в 48 раз больше, чем метод java String.trim().

И используя скомпилированный шаблон регулярного выражения Pattern pattern = Pattern.compile("s$|^s"); pattern.matcher("smiles").replaceAll(""); работает в 7,804 мс - примерно в 31 раз больше, чем метод java String.trim().

Ответ 9

Кажется, что нет готового к использованию java api, который делает это, но вы можете написать метод для этого. эта может быть полезна

Ответ 10

Я бы написал свою небольшую функцию, которая делает трюк, используя простой старый char доступ:

public static String trimBackslash( String str )
{
    int len, left, right;
    return str == null || ( len = str.length() ) == 0 
                           || ( ( left = str.charAt( 0 ) == '\\' ? 1 : 0 ) |
           ( right = len > left && str.charAt( len - 1 ) == '\\' ? 1 : 0 ) ) == 0
        ? str : str.substring( left, len - right );
}

Это ведет себя подобно тому, что делает String.trim(), только то, что оно работает с "\" вместо пространства.

Вот один из вариантов, который работает и фактически использует trim().;) Althogh это не очень эффективно, он, вероятно, побьет все подходы, основанные на регулярном выражении, разумно.

String j = "\joe\jill\";
j = j.replace( '\\', '\f' ).trim().replace( '\f', '\\' );

Ответ 11

Вот как бы я это сделал.

Я думаю, что это так же эффективно, насколько это разумно. Он оптимизирует случай с одним символом и избегает создания нескольких подстрок для каждой удаленной подпоследовательности.

Обратите внимание, что обрабатывается угловой случай прохождения пустой строки для обрезки (некоторые из других ответов переходят в бесконечный цикл).

/** Trim all occurrences of the string <code>rmvval</code> from the left and right of <code>src</code>.  Note that <code>rmvval</code> constitutes an entire string which must match using <code>String.startsWith</code> and <code>String.endsWith</code>. */
static public String trim(String src, String rmvval) {
    return trim(src,rmvval,rmvval,true);
    }

/** Trim all occurrences of the string <code>lftval</code> from the left and <code>rgtval</code> from the right of <code>src</code>.  Note that the values to remove constitute strings which must match using <code>String.startsWith</code> and <code>String.endsWith</code>. */
static public String trim(String src, String lftval, String rgtval, boolean igncas) {
    int                                 str=0,end=src.length();

    if(lftval.length()==1) {                                                    // optimize for common use - trimming a single character from left
        char chr=lftval.charAt(0);
        while(str<end && src.charAt(str)==chr) { str++; }
        }
    else if(lftval.length()>1) {                                                // handle repeated removal of a specific character sequence from left
        int vallen=lftval.length(),newstr;
        while((newstr=(str+vallen))<=end && src.regionMatches(igncas,str,lftval,0,vallen)) { str=newstr; }
        }

    if(rgtval.length()==1) {                                                    // optimize for common use - trimming a single character from right
        char chr=rgtval.charAt(0);
        while(str<end && src.charAt(end-1)==chr) { end--; }
        }
    else if(rgtval.length()>1) {                                                // handle repeated removal of a specific character sequence from right
        int vallen=rgtval.length(),newend;
        while(str<=(newend=(end-vallen)) && src.regionMatches(igncas,newend,rgtval,0,vallen)) { end=newend; }
        }

    if(str!=0 || end!=src.length()) {
        if(str<end) { src=src.substring(str,end); }                            // str is inclusive, end is exclusive
        else        { src="";                     }
        }

    return src;
    }

Ответ 12

public static String trim(String value, char c) {

    if (c <= 32) return value.trim();

    int len = value.length();
    int st = 0;
    char[] val = value.toCharArray();    /* avoid getfield opcode */

    while ((st < len) && (val[st] == c)) {
        st++;
    }
    while ((st < len) && (val[len - 1] == c)) {
        len--;
    }
    return ((st > 0) || (len < value.length())) ? value.substring(st, len) : value;
}

Ответ 13

10-летний вопрос, но чувствовал, что большинство ответов были немного запутанными или не совсем так, как было задано. Также самый голосующий ответ здесь не предоставил никаких примеров. Вот простой класс, который я сделал:

https://gist.github.com/Maxdw/d71afd11db2df4f1297ad3722d6392ec

Использование:

Trim.left("\joe\jill\", "\") == "joe\jill\"

Trim.left("jack\joe\jill\", "jack") == "\joe\jill\"

Trim.left("\\\\joe\\jill\\\\", "\") == "joe\\jill\\\\"