如何修剪Java中的字符?
例如
String j = “\joe\jill\”.Trim(new char[] {“\”});
j 应为
“乔\吉尔”
String j = “jack\joe\jill\”.Trim("jack");
j 应为
“\乔\吉尔\”
等
答案 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的removeStart
和removeEnd
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;
}