修剪Java中的字符

时间:2010-01-18 17:48:20

标签: java string trim

如何修剪Java中的字符?
例如

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

j 应为

  

“乔\吉尔”

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

j 应为

  

“\乔\吉尔\”

14 个答案:

答案 0 :(得分:83)

Apache Commons有一个很棒的StringUtils class(org.apache.commons.lang.StringUtils)。在StringUtils中,有strip(String, String)方法可以执行您想要的操作。

我强烈建议您使用Apache Commons,尤其是Collections和Lang库。

答案 1 :(得分:40)

这样做你想要的:

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

答案 2 :(得分:18)

CharMatcher - Google Guava

在过去,我是第二个Colins’ Apache commons-lang answer。但是现在谷歌的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";

非常好的东西。

答案 3 :(得分:7)

这是另一个非regexp,非超级棒,非超级优化,但非常容易理解的非外部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, "/");

答案 4 :(得分:1)

您可以使用来自Apache Commons Lang的removeStartremoveEnd StringUtils

答案 5 :(得分: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

答案 6 :(得分:0)

编辑:通过回答修改,只替换第一个和最后一个'\'字符。

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

答案 7 :(得分: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 ms 中运行,作为性能比较的参考实现。

trim( "smiles", "s" );以547毫秒的速度运行 - 大约是java的String.trim()方法的2倍。

"smiles".replaceAll("s$|^s","");在12,306毫秒内运行 - 大约是java String.trim()方法的48倍。

使用已编译的正则表达式模式Pattern pattern = Pattern.compile("s$|^s"); pattern.matcher("smiles").replaceAll("");在7,804毫秒内运行 - 大约是java的String.trim()方法的31倍。

答案 8 :(得分:0)

似乎没有准备好使用java api,但你可以编写一个方法来为你做这件事。 这个link可能有用

答案 9 :(得分: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()的替代方法。 ;)Althogh效率不高,它可能会胜过所有基于正则表达式的方法。

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

答案 10 :(得分:0)

我将如何做到这一点。

我认为它的效率和合理的效率一样高。它优化了单个字符的情况,并避免为每个删除的子序列创建多个子字符串。

请注意,处理将空字符串传递给trim的极端情况(其他一些答案将进入无限循环)。

/** 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;
    }

答案 11 :(得分:0)

library(googleway)

api_key <- "your_api_key"

df_locations <- data.frame(lat = c(54.481084), lon = c(-3.220625))

google_elevation(df_locations = df_locations, key = api_key)

# $results
# elevation location.lat location.lng resolution
# 1  813.9291     54.48108    -3.220625   610.8129
# 
# $status
# [1] "OK"

答案 12 :(得分:0)

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\\\\"

答案 13 :(得分:0)

我的解决方案:

private static String trim(String string, String charSequence) {
        var str = string;
        str = str.replace(" ", "$SAVE_SPACE$").
                  replace(charSequence, " ").
                  trim().
                  replace(" ", charSequence).
                  replace("$SAVE_SPACE$", " ");
        return str;
    }