76

Javaで文字をトリミングするにはどうすればよいですか?
例えば

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

jはあるべきです

「ジョー\ジル」

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

jはあるべきです

「\ジョー\ジル\」

4

14 に答える 14

110

Apache Commonsには優れたStringUtils クラス(org.apache.commons.lang.StringUtils) があります。あなたが望むことをStringUtilsする方法があります。strip(String, String)

とにかく Apache Commons、特に Collections と Lang ライブラリを使用することを強くお勧めします。

于 2010-01-18T20:16:56.820 に答える
46

これはあなたが望むことをします:

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
于 2010-01-18T18:11:31.580 に答える
20

CharMatcher– グーグルグアバ

以前は、Colins の Apache commons-lang answerを 2 番目に使用していました。しかし、Google の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";

とても素敵なもの。

于 2010-01-19T03:31:00.157 に答える
8

これは、別の非正規表現、非超素晴らしい、非超最適化ですが、非常に理解しやすい非外部ライブラリソリューションです。

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, "/");
于 2012-02-13T15:00:47.137 に答える
1

removeStartおよびremoveEndApache Commons Lang StringUtilsから使用できます

于 2010-01-18T18:15:09.667 に答える
1

最初のオプションの手作り:

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

于 2010-01-18T18:51:53.843 に答える
0

私は実際に、単純な古い 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() を使用する 1 つの代替手段です。;) あまり効率的ではありませんが、おそらくすべての正規表現ベースのアプローチよりもパフォーマンスが優れています。

String j = “\joe\jill\”;
j = j.replace( '\\', '\f' ).trim().replace( '\f', '\\' );
于 2010-01-18T19:07:20.207 に答える
0

編集:最初と最後の「\」文字だけを置き換えるために回答によって修正されました。

System.err.println("\\joe\\jill\\".replaceAll("^\\\\|\\\\$", ""));
于 2010-01-18T17:52:51.907 に答える
0

渡された文字列に基づいてトリミングする組み込み関数はないと思います。これを行う方法の小さな例を次に示します。これはおそらく最も効率的なソリューションではありませんが、おそらくほとんどの状況で十分に高速であり、ニーズを評価して適応させることができます。定期的に使用するコード スニペットについては、パフォーマンスをテストし、必要に応じて最適化することをお勧めします。以下に、例としていくつかのタイミング情報を含めました。

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」などは削除されません。

次の 1000 万回のそれぞれを実行するためのいくつかのパフォーマンス時間。

" mile ".trim();248 ミリ秒で実行され、パフォーマンス比較のためのリファレンス実装として含まれています。

trim( "smiles", "s" );String.trim()547 ミリ秒で実行されます。Java のメソッドの約 2 倍の長さです。

"smiles".replaceAll("s$|^s","");String.trim()12,306 ミリ秒で実行されます。これは、Java のメソッドの約 48 倍の長さです。

また、コンパイルされた正規表現パターンを使用すると、7,804 ミリ秒で実行されます。これは、Java のメソッドPattern pattern = Pattern.compile("s$|^s"); pattern.matcher("smiles").replaceAll("");の約 31 倍の長さです。String.trim()

于 2010-01-18T17:59:41.077 に答える
0

それを行うJava APIをすぐに使用できるようには見えませんが、それを行うためのメソッドを作成できます。このリンクは役に立つかもしれません

于 2010-01-18T18:01:19.113 に答える
0

これが私がそれを行う方法です。

合理的にできる限り効率的だと思います。単一文字のケースを最適化し、削除された各サブシーケンスに対して複数のサブストリングを作成することを回避します。

空の文字列をトリムに渡すというコーナーケースが処理されることに注意してください(他の回答のいくつかは無限ループに入ります)。

/** 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;
    }
于 2010-01-19T21:20:03.803 に答える