Javaで文字をトリミングするにはどうすればよいですか?
例えば。
String j = “\joe\jill\”.Trim(new char[] {“\”});
jは
「joe\jill」
String j = “jack\joe\jill\”.Trim("jack");
jは
「\ joe\jill \」
等
Apache Commons には素晴らしい StringUtils class (org.Apache.commons。 lang.StringUtils)。 StringUtils
には、必要な処理を行うstrip(String, String)
メソッドがあります。
とにかくApache Commons、特にコレクションとLangライブラリを使用することを強くお勧めします。
これはあなたが望むことをします:
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
CharMatcher
– Google Guava過去に、私は2番目の ColinsのApache commons-lang answer でした。しかし、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";
とても素敵なもの。
以下は、正規表現ではなく、非常に優れた、最適化されていない、しかし非常に理解しやすい非外部ライブラリソリューションです。
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, "/");
最初のオプションの手作り:
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
Apache Commons LangのremoveStart
とremoveEnd
を使用できます StringUtils
ここに私がそれをする方法があります。
合理的に可能な限り効率的だと思います。単一文字のケースを最適化し、削除されたサブシーケンスごとに複数のサブストリングを作成することを回避します。
空の文字列をトリムに渡すコーナーケースが処理されることに注意してください(他の回答のいくつかは無限ループに入ります)。
/** 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;
}
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;
}
実際には、単純な古い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', '\\' );
[〜#〜] edit [〜#〜]:回答によって修正され、最初と最後の「\」文字だけが置き換えられます。
System.err.println("\\joe\\jill\\".replaceAll("^\\\\|\\\\$", ""));
渡された文字列に基づいてトリムする組み込み関数はないと思います。これを行う方法の簡単な例を次に示します。これはおそらく最も効率的なソリューションではありませんが、ほとんどの状況で十分に高速であり、ニーズを評価して適応します。定期的に使用されるコードスニペットのパフォーマンスをテストし、必要に応じて最適化することをお勧めします。以下に、例としていくつかのタイミング情報を含めました。
_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」などは削除されません。
次の各1,000万回を実行するためのパフォーマンス時間。
" mile ".trim();
は248ミリ秒で実行されますパフォーマンス比較のリファレンス実装として含まれています。
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倍です。
すぐに使用できるJava apiを作成するAPIはありませんが、それを行うメソッドを作成できます。この link は便利かもしれません
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\\\\"